我如何知道是使用样式还是覆盖控件模板?

时间:2009-01-29 14:16:03

标签: c# wpf

这个问题的灵感来自this recent question和我在WPF开发中遇到的其他情况。我如何知道在控件上设置样式以覆盖某些默认行为与创建新控件模板是否足够?

更具体地说,在上面的问题中,作者想要在选择ListBoxItem时更改它的外观。 (参见下面转载的代码)。一切正常,但Background属性除外。如何知道他们应该为此控制模板?

<Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="Content" Value="{Binding Path=Name}"/>
        <Setter Property="Margin" Value="2"/>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="FontSize" Value="18"/>
                <Setter Property="Background" Value="Yellow"/>
                <Setter Property="Foreground" Value="Red"/>
            </Trigger>
        </Style.Triggers>

    </Style>

4 个答案:

答案 0 :(得分:4)

至于是否使用样式或模板Ray提供了很好的响应。

至于如何在不创建模板的情况下解决问题,也许我可以提供帮助。

背景颜色由SystemColors设置。使用Blend并创建模板,您可以看到确切的xaml。

所以,如果没有模板!是一项要求,您可以随时更改该资源。

示例:

    <ListBox>  
        <ListBox.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                             Color="Yellow" />

            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Content" Value="{Binding Path=Name}"/>
                <Setter Property="Margin" Value="2"/>
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold"/>
                        <Setter Property="FontSize" Value="18"/>                            
                        <Setter Property="Foreground" Value="Red"/>
                    </Trigger>
                </Style.Triggers>

            </Style>

        </ListBox.Resources>

        <ListBoxItem>Test 1</ListBoxItem>
        <ListBoxItem>Test 2</ListBoxItem>
        <ListBoxItem>Test 3</ListBoxItem>
    </ListBox>

这将为您提供给定ListBox的背景颜色,而不会搞砸应用程序中的任何其他内容。

答案 1 :(得分:3)

可以认为样式与HTML中的CSS样式非常接近。如果您只想更改控件的基本属性,例如Background,Foreground或它公开的任何属性,那么Style就是您所需要的。样式还允许您应用触发器,因此对于动画,样式也足够了。

如果您发现要更改控件上的内部行为/内部工作,则控制模板就是您想要的。例如,如果您想通过添加某种网格行为来更改按钮的布局方式,那么使用控件模板就是前进的方向。

答案 2 :(得分:0)

不幸的是,对于您的具体示例,除非您尝试,否则您不知道。基本上你首先尝试使用Style ....如果由于某种原因不起作用,那么你编写一个ControlTemplate。由于Ray提到的原因,你通常最终只会编写ControlTemplates。

我的猜测是你试图设置的触发器也在ControlTemplate中被硬编码...这是一个糟糕的设计imo因为它阻止了Style的覆盖。

答案 3 :(得分:0)

通过“背景”我将其视为选择时ListBoxItem周围的“蓝色”矩形?

这实际上是 FocusVisualStyle 属性,这是一种描述项目聚焦时应该是什么样子的样式。 Control显式设置此属性(描述为here),因此为了覆盖它,您必须重新定义控件模板,确保使用默认的样式设置器将其设置为{x:Null}。 / p>