使用继承定义自定义WPF控件

时间:2018-07-04 13:29:08

标签: c# wpf xaml datagrid

我猜我有一个简单的问题。基本上,我有一个WPF应用,其中我经常使用DataGrid控制。每次我都以相同的方式设置样式(只是数据,行和列的数量不同)。因此,我考虑创建自己的控件DataGridMatrix来满足我的需求。

我为此编写的代码如下:

<UserControl x:Class="StateMachines.UI.Controls.DataGridMatrix"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d">
    <DataGrid Width="450"
              RenderTransformOrigin="0.657,1.249"
              ItemsSource="{Binding Path=Logic.DefaultView}" ColumnWidth="*"
              CanUserReorderColumns="False"
              CanUserResizeColumns="False" CanUserAddRows="False" CanUserSortColumns="False"
              CanUserResizeRows="False" Grid.ColumnSpan="1">
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="{x:Type DataGridColumnHeader}"
                   BasedOn="{StaticResource MetroDataGridColumnHeader}">
                <Setter Property="HorizontalContentAlignment" Value="Center" />
            </Style>
        </DataGrid.ColumnHeaderStyle>
        <DataGrid.RowHeaderStyle>
            <Style TargetType="{x:Type DataGridRowHeader}"
                   BasedOn="{StaticResource MetroDataGridRowHeader}">
                <Setter Property="HorizontalContentAlignment" Value="Center" />
            </Style>
        </DataGrid.RowHeaderStyle>
        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource MetroDataGridCell}">
                <Setter Property="HorizontalContentAlignment" Value="Center" />
                <Style.Triggers>
                    <DataTrigger
                        Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Column.DisplayIndex}"
                        Value="0">
                        <Setter Property="Block.FontWeight" Value="Bold" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>
    </DataGrid>
</UserControl>

因此,如您所见,我仅设置样式,不将任何数据放入其中(在XAML中)。问题是我当然可以像下面这样将控件放入我的MainWindow.xaml中:

<controls:DataGridMatrix x:Name="DataGridTransition"/>

但是,如果我想让fe更改位置(在网格中,我希望它是Grid.ColumnSpan="2"而不是Grid.ColumnSpan="1") I can't do that, cuz the DataGrid is in my control, and my control isn't derived from DataGrid`本身(我想,如果它会被派生,那么我可以像在普通班级上那样做,对吗?)

所以最后我的问题是:有没有办法在我自己的XAML中从标准UserControl控件继承并以不同的方式设置样式(例如在这里,在我的代码中,我会省略{ {1}}标签,然后将其参数放在<DataGrid>标签中,而其他类似<UserControl>的东西将放在DataGrid.ColumnHeaderStyle的正下方)?

1 个答案:

答案 0 :(得分:1)

创建自定义DataGrid而不是自定义UserControl,即从XAML文件(<UserControl>)中删除DataGridMatrix.xaml根元素,如下所示:

<DataGrid    x:Class="WpfApp2.DataGridMatrix"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Width="450"
              RenderTransformOrigin="0.657,1.249"
              ItemsSource="{Binding Path=Logic.DefaultView}" ColumnWidth="*"
              CanUserReorderColumns="False"
              CanUserResizeColumns="False" CanUserAddRows="False" CanUserSortColumns="False"
              CanUserResizeRows="False" Grid.ColumnSpan="1">
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}"
                   BasedOn="{StaticResource MetroDataGridColumnHeader}">
            <Setter Property="HorizontalContentAlignment" Value="Center" />
        </Style>
    </DataGrid.ColumnHeaderStyle>
    <DataGrid.RowHeaderStyle>
        <Style TargetType="{x:Type DataGridRowHeader}"
                   BasedOn="{StaticResource MetroDataGridRowHeader}">
            <Setter Property="HorizontalContentAlignment" Value="Center" />
        </Style>
    </DataGrid.RowHeaderStyle>
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource MetroDataGridCell}">
            <Setter Property="HorizontalContentAlignment" Value="Center" />
            <Style.Triggers>
                <DataTrigger
                        Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Column.DisplayIndex}"
                        Value="0">
                    <Setter Property="Block.FontWeight" Value="Bold" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
</DataGrid>

...并将代码隐藏(DataGridMatrix.xaml.cs)中的基类从UserControl更改为DataGrid

public partial class DataGridMatrix : DataGrid
{
    public DataGridMatrix()
    {
        InitializeComponent();
    }
}