2013-08-20 127 views
0

我在我所有的DataGrid中要應用一些樣式的一些類型,但特別是在數據網格中,所以它看起來是這樣的:WPF使用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代碼做同樣的事情將其應用於所有數據網格?我已經做了文本框的例如樣式,但適用於在數據網格中的元素...

回答

3

因爲你可能想在一個風格資源的事件處理程序,我建議背後的創建代碼ResourceDictionary中。只需在Visual Studio中創建用戶控件和替換裏面的代碼 - 你將有兩個*的.xaml和* .xaml.cs文件很好地嵌套。爲了在整個應用程序申請樣式DataGrid中,包括他們在App.xaml中應用程序的資源:

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

我們希望有TextBox,僅在DataGrid內部應用LOVComboBox樣式 - 這就是爲什麼它們的樣式包含在DataGrid樣式的Style.Resources中的原因。我試圖把那裏的風格,從你的代碼拷貝(不帶X:主要屬性),但我得到了一個錯誤: 事件「的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 
    } 
} 
+0

工作完美,感謝您使用代碼的完整的解釋! – Louro

0

您可以創建在一個集中的位置包含這些樣式,然後在每次創建時引用此文件中的資源字典格。有一篇很好的文章概述了資源字典here

希望有所幫助。