如何从代码隐藏更改XAML元素模板?

时间:2015-12-03 07:19:19

标签: c# wpf xaml

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

<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>

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

即。改变&#34;好的&#34; (<Run Language="en-en" Text="OK"/>)to&#34;接受&#34;。 我怎么能这样做?

是否可以访问此TextBlock&#34; Text&#34;并完全改变我的一个按钮的内容,但不是所有的OK按钮?

我的按钮:

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

2 个答案:

答案 0 :(得分:3)

您可以借用模板Template中的一些道具,例如Tag属性。因此TextBlock中的ControlTemplate文字应该是这样的。

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

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

OkButton.Tag = "Accept";

如果没有手动设置所有按钮文本,您可以创建一些ValueConverter以将TextBlock中的ControlTemplate文本设置为&#34;确定&#34;只要Tag属性为空。

答案 1 :(得分:0)

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

<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>

然后,可以使用Contentcode behind设置另一个binding

通过代码背后:

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");
   }
}