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