WPF样式化样式中的嵌套元素

San*_*uze 2 c# wpf xaml styles

这个问题类似,我正在尝试尽可能轻松地设置ComboBoxItems的样式。但是,我正在根据此处找到的ComboBox的默认样式制作自定义样式。

<Style x:Key="MultiComboBox" TargetType="{x:Type ComboBox}">
    <Style.Resources>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="Style" Value="{StaticResource MultiComboBoxItem}"/>
        </Style>
    </Style.Resources>

    <Setter Property="SnapsToDevicePixels" Value="true" />
    <!--<Setter Property="OverridesDefaultStyle" Value="true" />-->
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
    ...
    ...
</Style>
.
.
.
<ComboBox Style="{StaticResource MyComboBox}">
    <ComboBoxItem x:Name="First">First</ComboBoxItem>
    <ComboBoxItem x:Name="Second">Second</ComboBoxItem>
    <ComboBoxItem x:Name="Third">Third</ComboBoxItem>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)

我将其添加<Style.Resources>到顶部,希望这里只需要一个引用,而不是将其单独添加到嵌套元素中,或者甚至首先需要将其添加到元素中。另外,我评论了所有的OverridesDefaultStyle二传手。

但是,然后我得到一个XAMLparseexception,“不允许Style对象影响所应用对象的Style属性”。该错误本身是有道理的,但是我认为自从定位以来,ComboBoxItem它应该可以工作。有没有解决的办法?

ASh*_*ASh 6

不允许使用样式对象影响所应用对象的样式属性

问题线如下:

<Style TargetType="{x:Type ComboBoxItem}">
    <Setter Property="Style" Value="{StaticResource MultiComboBoxItem}"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

尝试将它们重写为

<Style TargetType="{x:Type ComboBoxItem}" BasedOn="{StaticResource MultiComboBoxItem}">
</Style>
Run Code Online (Sandbox Code Playgroud)

或更好地使用ItemContainerStyle属性:

<Style x:Key="MultiComboBox" TargetType="{x:Type ComboBox}">

    <Setter Property="ItemContainerStyle" Value="{StaticResource MultiComboBoxItem}" />
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <!--<Setter Property="OverridesDefaultStyle" Value="true" />-->
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />

</Style>
Run Code Online (Sandbox Code Playgroud)