我有一个基本风格,比如说:
<Style x:Key="DefaultButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Background" Value="{StaticResource DefaultButtonBackground}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid x:Name="ButtonShapeGrid" Height="{TemplateBinding Height}" Width="{TemplateBinding Height}">
<!-- snip some shaping Xaml. -->
<ContentPresenter
Grid.RowSpan="2"
VerticalAlignment="{TemplateBinding VerticalAlignment}" HorizontalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在,我需要创建一些样式,用固定的东西替换按钮的内容......就像这样(其中CloseButtonGlyph是路径资源)。这很好用:
<Style x:Key="CloseButtonStyle" BasedOn="{StaticResource DefaultButtonStyle}" TargetType="{x:Type Button}">
<Setter Property="Content" Value="{StaticResource CloseButtonGlyph}" />
</Style>
但是,我还需要在内容中添加任意Xaml,这就是我遇到问题的地方。在WPF窗口或控件中使用样式时,以下内容不起作用(我得到设计时错误,指出内容无法从ContentElement或Visual派生):
<Style x:Key="WingDingStyle" BasedOn="{StaticResource DefaultButtonStyle}" TargetType="{x:Type Button}">
<Setter Property="Content">
<Setter.Value>
<TextBlock FontFamily="WebDings" Text="3" FontSize="18" Foreground="White" />
</Setter.Value>
</Setter>
</Style>
我不知道自己需要做什么。将TextBox放在窗口或控件中的按钮内容中工作正常,为什么不在样式中?
答案 0 :(得分:3)
对不起!上次没时间测试一次,这段代码效果很好
<Style TargetType="{x:Type Button}">
<Style.Resources>
<TextBlock x:Key="myContent" FontFamily="WebDings" Background="Red" Text="3" FontSize="18" Foreground="White" />
</Style.Resources>
<Setter Property="Content" Value="{DynamicResource myContent}"/>
</Style>
并像这样更改setter也可以正常工作
<Setter Property="Content" Value="{Binding Source={StaticResource myContent}}"/>
希望它能帮到你!!
答案 1 :(得分:0)
尝试这样的事情:
<Style x:Key="WingDingStyle" BasedOn="{StaticResource DefaultButtonStyle}" TargetType="{x:Type Button}">
<Style.Resources>
<TextBlock x:Key="myContent" FontFamily="WebDings" Text="3" FontSize="18" Foreground="White" />
</Style.Resources>
<Setter Property="Content" Value={StaticResource myContent}/>
</Style>
希望这会有所帮助!!
答案 2 :(得分:0)
我认为问题在于风格是在多个按钮之间共享的,因此WPF正在尝试向每个按钮添加相同的TextBlock(显然,TextBlock只能有一个UI元素作为其父元素)。
默认情况下尝试将样式设置为“不共享”,因此通过添加x:Shared属性为每个按钮创建一个新的TextBlock:
<Style x:Key="WingDingStyle" x:Shared="False" ...>