代码之家  ›  专栏  ›  技术社区  ›  Szymon Rozga

如何知道是使用样式还是重写控件模板?

  •  2
  • Szymon Rozga  · 技术社区  · 16 年前

    这个问题的灵感来自 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 回复  |  直到 16 年前
        1
  •  3
  •   Ray Booysen    16 年前

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

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

        2
  •  4
  •   JB.    16 年前

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

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

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

        3
  •  0
  •   Bubblewrap    16 年前

    不幸的是,对于您的具体示例,您不知道,除非您尝试它。基本上,你首先用一种风格来尝试它……如果这不起作用,不管是什么原因,然后你写一个ControlTemplate。你通常只会因为Ray提到的原因而编写控制模板。

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

        4
  •  0
  •   Adrian    16 年前

    “background”(背景)是指选中ListBoxItem时包围它的“blue”(蓝色)矩形?

    这实际上是 焦点视觉样式 属性,它是一种样式,用于描述项在聚焦时的外观。控件显式设置此属性(描述 here ,因此,为了重写它,必须重新定义控件模板,确保使用默认样式设置器将其设置为x:null。