以继承(BasedOn)样式设置内容

时间:2009-12-04 21:10:17

标签: wpf styles

我有一个基本风格,比如说:

<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放在窗口或控件中的按钮内容中工作正常,为什么不在样式中?

3 个答案:

答案 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" ...>