【问题标题】:Deriving (Expanding) a Control Template in WPF在 WPF 中派生(扩展)控件模板
【发布时间】:2012-03-14 08:28:21
【问题描述】:

我有这个 DataGrid 我想更改禁用行为 (xaml); 我想更改模板中的这个小部分。

如果不可能,我不介意使用:

<Setter Property="OverridesDefaultStyle" Value="True"/>

并且要替换我的控件的整个 xaml(模板),但我需要完整的模板来复制粘贴并帮助在哪里更改 Disabled 外观部分。

谁能帮帮我?

【问题讨论】:

  • 你能解释一下你到底想要达到什么目标吗?您想将一个新模板应用到 WPF DataGrid 并且您希望 DataGrid 的当前控件模板覆盖它?
  • 使用相同的模板,只是将 IsEnabled 前景从灰色更改为绿色(覆盖此部分)

标签: c# wpf templates xaml datagrid


【解决方案1】:

编辑:有人指出,所有默认控件模板都可以在MSDN 获得,这使得以下内容相关,但我将把它留在这里以引起兴趣。

给定一个控件实例,您可以使用System.Windows.Markup.XamlWriter 类序列化控件模板的标记。

获取控件模板:

string markup = System.Windows.Markup.XamlWriter.Save(control.Template);

获取控制模板使用的完整转储(包括触发器等)。

        StringBuilder markupBuilder = new StringBuilder();

        XmlWriter writer = XmlWriter.Create(markupBuilder);

        System.Windows.Markup.XamlDesignerSerializationManager manager = 
            new System.Windows.Markup.XamlDesignerSerializationManager(writer);

        manager.XamlWriterMode = System.Windows.Markup.XamlWriterMode.Value;

        // data grid named dataGrid1
        var template = dataGrid1.Template;

        System.Windows.Markup.XamlWriter.Save(dataGrid1.Template, manager);

        string markup = markupBuilder.ToString();

如果您只是希望在禁用 DataGrid 时更改其前景色,您应该能够将样式与触发器一起使用,而不是替换整个模板。

<DataGrid>
    <DataGrid.Resources>
        <Style
            TargetType="{x:Type DataGridColumnHeader}">
            <Style.Triggers>
                <DataTrigger
                    Binding="{Binding IsEnabled, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                    Value="False">
                    <Setter
                        Property="Foreground"
                        Value="Green" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <Style
            TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <DataTrigger
                    Binding="{Binding IsEnabled, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                    Value="False">
                    <Setter
                        Property="Foreground"
                        Value="Green" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
    <!-- Column Definitions -->
</DataGrid>

将上述两种样式添加到DataGrid的资源集合中,当DataGrid被禁用时,将每个列标题和数据行单元格的前景设置为绿色。

【讨论】:

  • 那种工作是不必要的,你可以在MSDN上获取所有模板,见stackoverflow.com/questions/1559261/…
  • @H.B.哦……我不知道。绝对更容易:)
  • 此外,Expression Blend 允许您创建任何控件模板的副本...
  • 谢谢。我试过: 比在上面粘贴你的 xaml 但它破坏了我的网格,这意味着它不像以前那样运行 - 没有行可见等。
  • 将 DataGrid.Resources 元素直接放在 DataGrid 元素中。
【解决方案2】:

要定义任何控件的禁用行为,您应该在控件模板中相应地更改禁用视觉状态。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-01-04
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多