如何从代码后台更改XAML元素的模板?

4

我在资源文件中定义了下一个按钮的样式:

<Style x:Key="OKBtn" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <Rectangle .../>

                    <TextBlock x:Name="Text" ..>
                        <Run Language="en-en" Text="OK"/>
                    </TextBlock>                        
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我希望在某些特定情况下更改代码中按钮的文本。

也就是说,将“OK”(<Run Language="en-en" Text="OK"/>)更改为“接受”。 我该怎么做呢?

是否可以访问此TextBlock "Text"并仅更改我的一个按钮的内容,而不是所有OK按钮的内容?

我的按钮:

<Button x:Name="OkButton" Style="{DynamicResource OKBtn}" />

你现在正在使用MVVM模式吗?为什么要使用代码后台更改模板的属性呢?我认为这对于WPF来说不是一个好主意。 - huoxudong125
2个回答

3

您可以从模板Template中借用一些属性,例如Tag属性。因此,在ControlTemplate中的TextBlock文本应该像这样。

<Run Language="en-en" Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Tag}"/>

通过设置按钮的 Tag 属性,您可以更改按钮的标题。

OkButton.Tag = "Accept";

为了不手动设置所有按钮文本,您可以创建一些ValueConverter来在ControlTemplate中将TextBlock文本设置为“Ok”,只要Tag属性为空。


0

首先,您应该声明ContentPresenter以显示Button控件中Content属性中的任何对象。

<Style x:Key="OkBtn" TargetType="Button">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Rectangle/>
                    <ContentPresenter Content="{Binding Path=Content, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"></ContentPresenter>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后,可以通过使用“代码后台”或“绑定”来设置另一个 Content

通过代码后台:

okButton.Content="desirableText";

通过绑定:

<Button x:Name="OkButton" Style="{DynamicResource OKBtn}" Content="{Binding FooText}" />

private string fooText;

public string FooText
{
   get { return fooText; }
   set
   {
       fooText = value;
       OnPropertyChanged("FooText");
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接