Определите настраиваемый элемент управления WPF с наследованием

Думаю, у меня простая проблема. В основном у меня есть приложение 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"/>

Но затем, если я хочу изменить положение (в сетке, например, я бы хотел, чтобы это был Grid.ColumnSpan = "2" вместо самого Grid.ColumnSpan = "1") I can't do that, cuz theDataGridis in my control, and my control isn't derived fromDataGrid` (я думаю, если бы он был получен, то я мог бы сделать это, как в обычных классах, верно?) ).

Итак, наконец, мой вопрос: есть ли способ унаследовать от стандартного элемента управления XAML в моем собственном UserControl и просто стилизовать его по-другому (как здесь, в моем коде я бы пропустил тег <DataGrid>, и я бы поместил его аргументы в тег <UserControl> + другие вещи, такие как DataGrid.ColumnHeaderStyle, можно было бы разместить прямо под <UserControl>)?

Вместо создания настраиваемого элемента управления вы можете попробовать создать стиль на основе DataGrid. Таким образом, вы можете использовать стиль и при этом изменять некоторые свойства сетки.

Lupu Silviu 04.07.2018 15:31

Создайте настраиваемый DataGrid вместо настраиваемого UserControl.

mm8 04.07.2018 15:36

@LupuSilviu Итак, если бы я хотел иметь 3 DataGrid, я бы просто сделал 3x <DataGrid></DataGrid>, а затем где-то над ними я определил свой стиль, который влияет на все DataGrid? @ mm8 -> Как мне его создать? Я имею ввиду Add->New Item и что дальше?

minecraftplayer1234 04.07.2018 15:37

@Frynio: Просто удалите корневой элемент <UserControl> и унаследуйте частичный класс от DataGrid. Смотрите мой ответ.

mm8 04.07.2018 15:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
835
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте собственный 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();
    }
}

Ммм. А если у меня нет файла *.xaml.cs? Потому что я сделал Add->New Item->WPF Control? Стоит ли добавлять вручную?

minecraftplayer1234 04.07.2018 15:48

У вас должен быть файл DataGridMatrix.xaml.cs, если у вас есть атрибут x: Class в вашем XAML ... который есть в опубликованном вами образце разметки.

mm8 04.07.2018 15:50

Боже, я такой тупой. Не заметил стрелки возле имени файла. В любом случае, спасибо, я думаю, это сработает для меня, я не могу проверить, знаю, потому что я далеко от своего компьютера, но я определенно приму ваш ответ. Еще раз спасибо

minecraftplayer1234 04.07.2018 15:54

Другие вопросы по теме