我在资源中定义了下一个按钮的样式:
<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}" />
答案 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>
然后,可以使用Content
或code 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");
}
}