【问题标题】:WPF C# How can I create derived styles by codeWPF C#如何通过代码创建派生样式
【发布时间】:2019-05-24 18:11:52
【问题描述】:

我想使用使用不同内容的 ListBoxItems。对于 xaml 中的定义,我使用以下方法。

<Style TargetType="{x:Type ListBoxItem}" x:Key="ExampleBaseListBoxItem">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border>
                    <ContentPresenter  HorizontalAlignment="Stretch" VerticalAlignment="Center"      />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>   
</Style>


<Style x:Key="ExampleListBoxItem"  TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <ListBoxItem Style="{DynamicResource ExampleBaseListBoxItem}">
                    <TextBox  />
                </ListBoxItem>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这很好用,但我有两个问题。

  1. 这是在 xaml 中定义的好习惯,还是应该使用 还有什么?

  2. 当样式
    ExampleBaseListBoxItem 已经存在

请不要担心文本框。我正在寻找一种方法,示例本身仅用于演示目的。

【问题讨论】:

    标签: wpf styles code-behind


    【解决方案1】:

    这不是处理此类事情的常用方法。

    您应该在 xaml 而不是代码中定义样式和模板。

    但是。

    使用 Datatype= 匹配视图模型类型的数据模板比重新模板化 listboxitem 更常见。

    类型是行视图模型的类型。

    所以你会有(比如)一个 TextBoxVM 类、一个 DividerVM 类等。

    您将对象的 Observablecollection 绑定到您的 itemssource。

    将 TextBoxVM 模板化为文本框,将dividervm 模板化为分隔符等。

    我碰巧遇到的第一个例子:

    <DataTemplate DataType="{x:Type local:DividerVM}">
        <local:Divider />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:DrawCategoryVM}">
        <Grid>
            <TextBlock FontSize="{DynamicResource BigFont}" Text="{Binding Heading}" />
        </Grid>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:DrawOptionVM}">
        <Grid Height="38"
              Background="Transparent"
              >
    

    您可以使用 basedon 将一种样式的属性“继承”到另一种样式中。

    【讨论】:

    • 谢谢安迪,这可能是更好的方法。但我还不相信。正如我在原始帖子中提到的,简单的 TextBox 只是一个示例。在现实世界的应用程序中,基础 ListBoxItem 的 ControlTemplate 包含多个组件,并且在某个特定位置只有一个 Contentpresenter。这就是提供的示例有效的原因。我想知道是否可以通过使用所示方法重用所有其他组件。
    • 数据模板将应用于内容。它创建的 UI 将出现在 itemtemplate 的 contentpresenter 所在的位置。你可以在 itemtemplate 中用任何你喜欢的东西包围它。
    猜你喜欢
    • 2013-02-07
    • 2018-07-16
    • 1970-01-01
    • 2010-09-05
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多