#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 недопустимы».