2009-01-29 69 views
2

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

更具体地说,在上面的问题中,作者希望在选中时更改ListBoxItem的外观。 (见下面转载的代码)。一切正常,除了背景属性。人们应该如何知道他们应该为此重写控制模板?

<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> 
+0

Hey Siz。如果我们已经进入IsSelected属性问题,您是否可以更改问题的标题? ;) – 2009-01-30 12:38:06

回答

3

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

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

+0

好吧,我明白了。但看看我链接到的问题。他希望在选中时更改ListBoxItem的行为(IsSelected属性设置为true)。他可以做任何事情,但是,他不能改变背景。所以...人们如何知道如何改变这个特定的财产? – 2009-01-29 16:09:33

0

不幸的是,对于您的具体示例,除非您尝试,否则您不知道。基本上,你首先尝试一个样式....如果这不起作用,然后你写一个ControlTemplate。出于Ray提到的原因,您通常最终只能编写ControlTemplates。

我的猜测是你试图设置的触发器已经在ControlTemplate中硬编码......这是不好的设计imo,因为它阻止了Style覆盖它。

0

“背景”我认为它是指在选择时围绕ListBoxItem的“蓝色”矩形?

这实际上是FocusVisualStyle属性,它是描述项目聚焦时的外观样式的样式。 Control明确地设置了这个属性(描述here),所以为了覆盖它,你将不得不重新定义控制模板,确保使用默认的样式设置器将其设置为{x:Null}。

4

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

至于如何解决您的问题,而无需创建模板,也许我可以提供帮助。

背景颜色由SystemColors设置。使用混合和创建模板,你可以看到确切的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> 

这会给你该给定列表框的背景颜色,而不是搞砸任何事在其他应用程序。

+0

不是我正在寻找的;但一个很好的答案。 +1。 – 2009-01-30 14:09:07

相关问题