Wpf CustomControl为什么样式设置不会覆盖默认的

时间:2015-11-16 11:50:04

标签: wpf xaml custom-controls

考虑以下非常简单的CustomControl:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:ViewToLearn.WpfControls">


    <Style TargetType="{x:Type local:VtlCustomButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:VtlCustomButton}">
                    <Grid>
                        <Button  Content="Hi" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

如果我将一些这些添加到测试项目中,我会得到以下结果:

enter image description here

到目前为止一切顺利。现在我决定实际上我更喜欢将每个按钮的背景颜色设置为红色。显然我可以单独设置每个按钮的背景属性;

 <Button  Content="Hi" Background="Red" />

这将有效。然而逻辑规定,如果我希望所有按钮都有一个红色边框,那么显然风格会更有意义,所以为此我改变了控件的代码:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:ViewToLearn.WpfControls">

    <Style TargetType="{x:Type Button}">
        <Setter Property="Background"
                Value="Red" />
    </Style>
    <Style TargetType="{x:Type local:VtlCustomButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:VtlCustomButton}">
                    <Grid>
                        <Button  Content="Hi" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

但是这没有效果。我确信原则是正确的,但将其应用于自定义控件的细节会让我感到沮丧。为什么这是因为它目前未能产生预期的结果。是因为我把风格放在哪里,还是因为我没有掌握的更基本的东西?

修改

我一直在尝试创建自定义(非用户)控件以及将样式和模板应用于它们的方法。我真正想要影响的控件由几个不同的元素(按钮,图像,面板文本框等)组成,但为了这个问题,我选择了一个基于标准vs模板的自定义控件,从而产生上面显示的代码。使用基于肯定没有出现工作,但我确实发现以下修正确实有效。我很想知道为什么这比我的原创和我在第一时间做的不正确(这可能是一种更有效的方法去解决这个问题,特别是因为有几个元素的风格我想修改)。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:ViewToLearn.WpfControls">

    <Style x:Key="vtlstyle"
           TargetType="{x:Type Button}">
        <Setter Property="Background"
                Value="Red" />
    </Style>
    <Style TargetType="{x:Type local:VtlCustomButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:VtlCustomButton}">
                    <Grid>
                        <Button  Content="Hi"
                                 Style="{StaticResource vtlstyle}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

1 个答案:

答案 0 :(得分:0)

使用receive(Message)

BasedOn

<强>编辑&gt;&GT;&GT;&GT;&GT;

使用按钮上的样式(资源不足):

<Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Red" />
</Style>

<Style x:Key="myButtonStyle" TargetType="{x:Type local:VtlCustomButton}" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="Content" Value="Hi"/>
</Style>