WPF — изменить стиль сетки данных MahappsMetro

#c# #wpf #xaml #mvvm #mahapps.metro

#c# #wpf #xaml #mvvm #махаппс.метро

Вопрос:

В настоящее время я работаю с MVVM в WPF, я установил MahappsMetro в свой проект. Я хочу изменить стиль сетки данных по умолчанию, не теряя всех свойств стиля MetroDataGrid (стиль для DataGrid из MahappsMetro).

Я просто хочу изменить некоторые триггеры как IsMouseOver и IsSelected, я пытался это сделать:

Я определил этот стиль в App.xaml

 <Style x:Key="TransparentDataGrid" TargetType="{x:Type DataGrid}" BasedOn="{StaticResource MetroDataGrid}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGrid}">
                    <DataGrid>
                        <DataGrid.RowStyle>
                            <Style TargetType="{x:Type DataGridRow}">       
                                <Style.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter Property="Background" Value="Transparent" />
                                    </Trigger>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter Property="Background" Value="Transparent" />
                                        <Setter Property="Foreground" Value="Black" />
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </DataGrid.RowStyle>
                        <DataGrid.CellStyle>
                            <Style TargetType="{x:Type DataGridCell}">
                                <Style.Triggers>
                                    <Trigger Property="DataGridCell.IsSelected" Value="True">
                                        <Setter Property="Background" Value="Transparent" />
                                        <Setter Property="BorderBrush" Value="Transparent" />
                                        <Setter Property="Foreground" Value="Black" />
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </DataGrid.CellStyle>
                    </DataGrid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
 

И я привязываю этот стиль там, где он мне нужен

     Style="{DynamicResource TransparentDataGrid}"
 

Но я получаю исключение :

 A first chance exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll
 

Также я пытался :

Я создал стиль в MainViewModel.xaml, но я не знаю, как привязать этот стиль к другим представлениям.

Ответ №1:

чтобы получить существующий стиль для элементов управления, вам необходимо указать тип в качестве ключа в на основе атрибута

 <Style x:Key="TransparentDataGrid" TargetType="{x:Type DataGrid}" BasedOn="{StaticResource {x:Type MetroDataGrid}}">
    <Setter Property="Template">
        <Setter.Value>
        ...
 

если выше не работает, то сделайте префикс с правильным пространством MetroDataGrid имен, например mapp:MetroDataGrid , где mapp указывает на сборку MahappsMetro

например

 <Application x:Class="CSharpWPF.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml"
         xmlns:mapp="clr-namespace:MahApps.Metro.Controls">
<Application.Resources>
     <Style x:Key="TransparentDataGrid" TargetType="{x:Type DataGrid}" BasedOn="{StaticResource {x:Type mapp:MetroDataGrid}}">
         <Setter Property="Template">
             <Setter.Value>
              ...
</Application.Resources>
 

используйте правильную сборку, приведенную выше, это всего лишь пример

Комментарии:

1. {StaticResource {x:введите MetroDataGrid}} невозможно, потому что MetroDataGrid не поддерживается в WPF, в App.xaml.

2. Вам необходимо определить пространство имен для того же <Application> самого тега in. например xmlns:mapp="clr-namespace:MahApps.Metro.Controls" , и измените его на {StaticResource {x:Type mapp:MetroDataGrid}}

3. Я пытался, но {StaticResource {x:Type mapp:Metro DataGrid}} это невозможно. Привязка будет {StaticResource {x:Type mapp:TypeName=DataGrid}} (потому что после mapp: должно быть или Type или TypeName). Однако с последним синтаксисом возникает проблема: «Аргументы x: type недопустимы».