在WPF中,有没有办法将两个Style组合成一个控件?

时间:2011-06-11 00:22:18

标签: wpf xaml styles

我的情况如下。

我有一个App.xaml,其中包含ListView样式,如下所示:

<Style x:Key="{x:Type ListViewItem}" TargetType="ListViewItem">
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBoxItem">
              ...

但是,我想将一些样式添加到另一个xaml中,让我们在Window.xaml中这样说:

 <ListView AlternationCount="2" Background="#FFECECEC">
    <ListView.Resources>
        <Style x:Key="{x:Type ListViewItem}" TargetType="{x:Type ListViewItem}">
            <EventSetter Event="PreviewMouseDoubleClick" Handler="OnPreviewMouseDoubleClick" />
        </Style>
    </ListView.Resources>
 </ListView>

所以,我想要做的是在App.xaml中将基本设计的样式定义为默认样式。 然后,添加一些修改,例如添加上下文菜单,从每个xaml添加事件。

但是,通过上面的实现,App.xaml中定义的样式将被Window.xaml中定义的样式覆盖。

有没有办法解决问题并实现它?

2 个答案:

答案 0 :(得分:9)

样式具有BasedOn属性:

<Style x:Key="Style1">
...
</Style>

<Style x:Key="Style2" BasedOn="{StaticResource Style1}">
...
</Style>

顺便说一下:<Style x:Key="{x:Type ListViewItem}"似乎有点奇怪。 x:Key应该是xaml字典中的唯一键 - 通常是字符串。

答案 1 :(得分:2)

如果 BasedOn 属性符合您的需求,那么它是最佳选择。但是对于更复杂的场景,the solution referred to in this question之类的内容更灵活。