WPF使用Datagrid共享资源

时间:2013-08-20 18:06:10

标签: wpf datagrid resources styles code-reuse

我在所有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中的元素...

2 个答案:

答案 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

希望有所帮助。