我在所有datagrids中都有一些样式要应用于某些类型,但特别是在datagrid中,所以它看起来像这样:
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"></EventSetter>
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="BorderBrush" Value="White"/>
<Setter Property="BorderThickness" Value="2"/>
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type vmcc:LOVComboBox}">
<EventSetter Event="Loaded" Handler="UIElement_GotFocus"></EventSetter>
</Style>
<Style TargetType="{x:Type TextBox}">
<EventSetter Event="Loaded" Handler="UIElement_GotFocus"></EventSetter>
</Style>
</DataGrid.Resources>
如何在我的应用程序中的单个点(例如在样式文件中)创建xaml代码来执行将其应用于所有数据网格的相同操作?我已经为文本框做了样式,但这适用于datagrid中的元素...
答案 0 :(得分:3)
因为您可能希望在样式资源中使用事件处理程序,所以我建议使用后面的代码创建ResourceDictionary。只需在Visual Studio中创建UserControl并替换里面的代码 - 您将同时嵌套* .xaml和* .xaml.cs文件。为了在整个应用程序中应用DataGrid的样式,请将它们包含在App.xaml中的Application资源中:
<Application.Resources>
<ResourceDictionary Source="MyStyles.xaml"/>
</Application.Resources>
MyStyles.xaml文件中的代码:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Example.MyStyles"
xmlns:vmcc="clr-namespace:Example">
<Style TargetType="{x:Type DataGridCell}" x:Key="DataGrid.DataGridCellStyle">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"></EventSetter>
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="BorderBrush" Value="White" />
<Setter Property="BorderThickness" Value="2" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type vmcc:LOVComboBox}" x:Key="DataGrid.LOVComboBoxStyle">
<EventSetter Event="Loaded" Handler="UIElement_GotFocus"></EventSetter>
</Style>
<Style TargetType="{x:Type TextBox}" x:Key="DataGrid.TextBoxStyle">
<EventSetter Event="Loaded" Handler="UIElement_GotFocus"></EventSetter>
</Style>
<Style TargetType="{x:Type DataGrid}">
<Style.Resources>
<Style TargetType="DataGridCell" BasedOn="{StaticResource DataGrid.DataGridCellStyle}" />
<Style TargetType="vmcc:LOVComboBox" BasedOn="{StaticResource DataGrid.LOVComboBoxStyle}" />
<Style TargetType="TextBox" BasedOn="{StaticResource DataGrid.TextBoxStyle}" />
</Style.Resources>
</Style>
</ResourceDictionary>
我们希望仅在DataGrid中应用TextBox,LOVComboBox样式 - 这就是为什么它们的样式包含在DataGrid样式的Style.Resources中的原因。我试图把你的代码中复制的样式(没有x:Key属性),但我收到一个错误: 无法在Style中的Target标记上指定事件'PreviewMouseLeftButtonDown'。请改用EventSetter。。这就是为什么我使用键将数据提取为资源,并在DataGrid样式的Style.Resources中使用派生样式(如建议的here)。
MyStyles.xaml.cs文件中的代码:
public partial class MyStyles
{
private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//your code here
}
private void UIElement_GotFocus(object sender, RoutedEventArgs e)
{
//your code here
}
}
答案 1 :(得分:0)
您可以在集中位置创建包含这些样式的资源字典,然后在每次创建网格时引用此文件。有一篇很好的文章概述了资源词典here。
希望有所帮助。