如何创建自定义,可重用的数据网格

时间:2016-09-06 20:25:27

标签: c# wpf

我经常发现自己使用的数据网格只有在禁用选择的情况下才能读取。当我遇到这个问题时,我总是要回顾旧项目来确定我需要使用的设置。我知道必须有一种方法来创建这个控件的自定义版本并保存适当的设置。

我做的第一件事就是创建2个资源字典,其中包含我想重复使用的设置存储在自己的程序集中。从我正在阅读的内容来看,这不是最佳解决方案,因为共享资源词典可能代价高昂。

只读资源字典:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:Chapman.ClientTemplate.Views">
<Style TargetType="{x:Type DataGrid}">
    <Setter Property="CanUserAddRows" Value="False" />
    <Setter Property="CanUserDeleteRows" Value="False" />
    <Setter Property="CanUserReorderColumns" Value="False" />
    <Setter Property="CanUserResizeColumns" Value="False" />
    <Setter Property="CanUserResizeRows" Value="False" />
    <Setter Property="CanUserSortColumns" Value="False" />
    <Setter Property="IsReadOnly" Value="True" />
</Style>
</ResourceDictionary>

选择已禁用资源字典:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Style TargetType="{x:Type DataGrid}">
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="BorderBrush" Value="#FF688CAF"/>
    <Setter Property="BorderThickness" Value="1"/>

<!-- blah blah found this code online somewhere and seemed to work. -->
</Style>
</ResourceDictionary>

然后我尝试创建一个自定义数据网格,如下所示:

public class ReadOnlyDataGrid : DataGrid
{
    public ReadOnlyDataGrid()
        : base()
    {
        this.Resources.MergedDictionaries.Add(new System.Windows.ResourceDictionary()
        {
            Source = new Uri("pack://application:,,,/MyApp.Wpf;component/DataGridReadOnly.xaml")
        });

        this.Resources.MergedDictionaries.Add(new System.Windows.ResourceDictionary()
        {
            Source = new Uri("pack://application:,,,/MyApp.Wpf;component/DataGridSelectDisabled.xaml")
        });
    }
}

然而,由于某种原因,这似乎并没有正确应用我的风格。此外,我不喜欢我必须使用这样的硬编码uri加载资源字典的方式。它看起来不对。有人可以提出更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您只需要只读数据网格样式,请使用:

  1. 使用资源字典中的“ReadonlyDataGrid”键定义样式
  2. 例如:

    <Style TargetType="{x:Type DataGrid}" x:Key="ReadonlyDataGrid">
            <Setter Property="CanUserAddRows" Value="False" />
            <Setter Property="CanUserDeleteRows" Value="False" />
            <Setter Property="CanUserReorderColumns" Value="False" />
            <Setter Property="CanUserResizeColumns" Value="False" />
            <Setter Property="CanUserResizeRows" Value="False" />
            <Setter Property="CanUserSortColumns" Value="False" />
            <Setter Property="IsReadOnly" Value="True" />
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="BorderBrush" Value="#FF688CAF"/>
            <Setter Property="BorderThickness" Value="1"/>
        </Style>
    
    1. 将资源字典添加到您的应用程序
    2. 例如:

      <Application x:Class="Dashboard.App"
               xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Application.Resources>
              <ResourceDictionary>
                  <ResourceDictionary.MergedDictionaries>
                      <ResourceDictionary Source="/Core.Client;component/Styles/DataGrid.xaml"/>            
              </ResourceDictionary>
          </Application.Resources>
      </Application>
      
      1. 使用应用程序datagrid的样式
      2. 例如:

        <DataGrid Style="{StaticResource ReadonlyDataGrid}"/>
        

答案 1 :(得分:0)

为什么不创建代码段并与共享驱动器上需要它的任何开发人员共享?

这样可以避免使用资源字典。

https://msdn.microsoft.com/en-us/library/ms165392.aspx