在WPF中派生(扩展)控制模板

时间:2012-03-14 08:28:21

标签: c# wpf templates xaml datagrid

我有这个DataGrid我想改变Disabled行为(xaml); 我想在模板中更改这个小部分。

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

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

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

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

编辑:已经指出所有默认控件模板都可以在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>

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

答案 1 :(得分:0)

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