【问题标题】:WPF Styling nested elements from a styleWPF样式化样式中的嵌套元素
【发布时间】:2016-11-07 19:39:12
【问题描述】:

类似于this SO 问题,我正在尝试尽可能轻松地设置 ComboBoxItems 的样式。但是,我正在根据 here 找到的 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>

我在顶部添加了&lt;Style.Resources&gt; 位,希望这里只需要一个引用,而不是单独将其添加到嵌套元素中,甚至首先需要将其添加到元素中。另外,我注释掉了所有的 OverridesDefaultStyle Setters。

但是,然后我得到一个 XAMLparseexception,“不允许样式对象影响它所应用的对象的样式属性”。该错误本身是有道理的,但我认为既然我的目标是ComboBoxItem,它应该可以工作。有没有办法解决这个问题?

【问题讨论】:

    标签: c# wpf xaml styles


    【解决方案1】:

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

    有问题的行是:

    <Style TargetType="{x:Type ComboBoxItem}">
        <Setter Property="Style" Value="{StaticResource MultiComboBoxItem}"/>
    </Style>
    

    尝试将它们重写为

    <Style TargetType="{x:Type ComboBoxItem}" BasedOn="{StaticResource MultiComboBoxItem}">
    </Style>
    

    或者最好使用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>
    

    【讨论】:

    • 谢谢。我在上一个问题中看到了这一点,但他们对ItemContainerStyle 采取的行动让我觉得这对我来说不是正确的答案。谢谢你让我直截了当。只要允许,我就会接受这个答案。
    • 现在我的问题是,我将如何为 StackPanel 执行此操作?
    • @SanjayCruze,StackPanel 到底应该怎么做?
    • 将样式应用于堆栈面板(而不是组合框)的所有子级,因为堆栈面板没有 ItemContainerStyle 属性。不过,我最终弄清楚了。在 stackpanel 样式中,我添加了&lt;Style.Resources&gt; &lt;Style BasedOn="{StaticResource MyRadioButton}" TargetType="{x:Type RadioButton}"/&gt; &lt;/Style.Resources&gt;
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多