C# 如何知道是使用样式还是替代控件模板?

C# 如何知道是使用样式还是替代控件模板?,c#,wpf,C#,Wpf,这个问题的灵感来自于我在WPF开发中遇到的其他情况。与创建新控件模板相比,如何知道在控件上设置样式以覆盖某些默认行为是否足够 更具体地说,在上面的问题中,作者希望在选择ListBoxItem时更改其外观。(见下面重印的代码)。除了Background属性外,所有功能都正常工作。人们怎么知道他们应该为此重写控件模板 <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Content" Value=

这个问题的灵感来自于我在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>

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


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

不幸的是,对于您的特定示例,除非您尝试,否则您不知道。基本上,您首先尝试一种样式……如果出于任何原因,这种样式不起作用,那么您就编写一个ControlTemplate。您通常只会因为Ray提到的原因而编写ControlTemplates

我猜您试图设置的触发器也在ControlTemplate中进行了硬编码…这在我看来是糟糕的设计,因为它阻止样式覆盖它。

通过“背景”,我认为它是指选中ListBoxItem时包围它的“蓝色”矩形


这实际上是FocusVisualStyle属性,它描述了项目在聚焦时的外观。控件显式设置此属性(如所述),因此为了覆盖它,必须重新定义控件模板,确保使用默认样式设置器将其设置为{x:Null}。

关于是使用样式还是使用模板,Ray提供了很好的响应

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

背景色由系统颜色设置。使用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>

测试1
测试2
测试3

这将为您提供给定列表框的背景色,而不会破坏应用程序中的任何其他内容。

我理解。但请看一看我链接到的问题。他希望在选中ListBoxItem时更改其行为(IsSelected属性设置为true)。他什么都能做,但他不能改变背景。所以你怎么知道如何改变这个特定的属性?嘿,西兹。如果我们转到IsSelected property问题,您可以更改问题的标题吗?;)不完全是我想要的;但这是一个很好的答案+1.