Определите пользовательский элемент управления WPF с наследованием - PullRequest
0 голосов
/ 04 июля 2018

У меня есть простая проблема, я думаю. В основном у меня есть приложение WPF, в котором я часто использую DataGrid control. И каждый раз, когда я делаю это по-разному (только данные, количество строк и столбцов различны). Поэтому я подумал о создании собственного элемента управления 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 и просто стилизовать его по-другому (как здесь, в моем коде я бы опустил тег <DataGrid> и Я бы поместил его аргументы в тег <UserControl>, а другие элементы, например DataGrid.ColumnHeaderStyle, будут расположены прямо под <UserControl>)?

1 Ответ

0 голосов
/ 04 июля 2018

Создайте пользовательский DataGrid вместо пользовательского UserControl, т.е. удалите корневой элемент <UserControl> из файла XAML (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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...