2012-10-24 121 views
3

我有我的WPF應用程序DataGrid的一個XAML代碼風格,我現在寫的是從DataGrid中繼承的自定義控制的想在代碼應用以下樣式背後:WPF DataGrid的風格背後

<Style TargetType="DataGrid"> 

    <!-- Make the border and grid lines a little less imposing --> 
    <Setter Property="BorderBrush" Value="#DDDDDD" /> 
    <Setter Property="HorizontalGridLinesBrush" Value="#DDDDDD" /> 
    <Setter Property="VerticalGridLinesBrush" Value="#DDDDDD" /> 

    <Setter Property="RowStyle"> 
     <Setter.Value> 
      <Style TargetType="DataGridRow"> 
       <Style.Triggers> 
        <!-- Highlight a grid row as the mouse passes over --> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="Lavender" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="CellStyle"> 
     <Setter.Value> 
      <Style TargetType="DataGridCell"> 
       <Style.Triggers> 
        <!-- Highlight selected rows --> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Background" Value="Lavender" /> 
         <Setter Property="BorderBrush" Value="Lavender" /> 
         <Setter Property="Foreground" Value="Black" /> 
        </Trigger> 
        <!--StartsEditingOnMouseOver--> 
        <!--<Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="IsEditing" Value="True" /> 
        </Trigger>--> 
       </Style.Triggers> 

       <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown" /> 
       <EventSetter Event="PreviewTextInput" Handler="DataGridCell_PreviewTextInput" /> 

       <!-- Add some padding around the contents of a cell --> 
       <Setter Property="Padding" Value="4,3,4,3" /> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="DataGridCell"> 
          <Border Padding="{TemplateBinding Padding}" 
          Background="{TemplateBinding Background}"> 
           <ContentPresenter /> 
          </Border> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

我有什麼迄今下面的代碼:

static DionysusDataGrid() 
{ 

    BorderBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata(ColorConverter.ConvertFromString("#FFDDDDDD") as Color?)); 
    HorizontalGridLinesBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata(ColorConverter.ConvertFromString("#FFDDDDDD") as Color?)); 
    VerticalGridLinesBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata(ColorConverter.ConvertFromString("#FFDDDDDD") as Color?)); 

} 

但我不知道如何做同樣的「RowStyle」屬性,它也有一個風格本身。並且在設置BorderBrushProperty時我也遇到以下錯誤:

Default value type does not match type of property 'BorderBrush'." 

任何人都可以幫我解決嗎?

感謝名單

UPDATE:

我的代碼更新到下面的解析錯誤:

static DionysusDataGrid() 
{ 

    BrushConverter converter = new BrushConverter(); 

    BorderBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata((System.Windows.Media.Brush)converter.ConvertFromString("#FFDDDDDD"))); 
    HorizontalGridLinesBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata((System.Windows.Media.Brush)converter.ConvertFromString("#FFDDDDDD"))); 
    VerticalGridLinesBrushProperty.OverrideMetadata(typeof(DionysusDataGrid), new FrameworkPropertyMetadata((System.Windows.Media.Brush)converter.ConvertFromString("#FFDDDDDD"))); 

} 
+0

您是否嘗試對非空值'Color'進行常規轉換?即:'(Color)ColorConverter.ConvertFromString(「#FFDDDDDD」)' –

+0

BorderBrushProperty.OverrideMetadata(typeof(DionysusDataGrid),new FrameworkPropertyMetadata((Color)ColorConverter.ConvertFromString(「#FFDDDDDD」)));給出相同的錯誤。 –

+0

確保您使用顏色類型的正確名稱空間,並根據BorderBrush的類型進行檢查。 –

回答

6

要使風格在後面的代碼,一些一般的規則:

您在XAML中輸入的任何內容在舊版C#中都有相應的內容:

<Style ...>只是System.Windows.StyleSetterTrigger也是如此,您可以將其命名。

唯一的疑難雜症來自ContentProperty屬性,它是默認屬性分配,例如,當你這樣做:

<TextBlock>My text here!</TextBlock> 

它設置TextBlock.Text屬性"My text here!",因爲TextBlock類標有屬性[ContentProperty("Text")]

最後,你需要從最嵌套的元素開始,當你從C#編譯:

<Style TargetType="DataGrid"> 
    <Setter Property="BorderBrush" Value="#DDDDDD" /> 
</Style> 

變爲:

var brushConverter = new BrushConverter(); 

var bbSetter = new Setter(
    DataGrid.BorderBrushProperty, 
    brushConverter.ConvertFromString("#FFDDDDDD")); 

var style = new Style(typeof(DataGrid));  
style.Setters.Add(bbSetter); 

從這個你應該能夠對任何XAML轉換爲C#,
要注意,雖然,你不能映射任何C#來XAML,例如,你可以是非常有用的在XAML中製作動態故事板,但你可以在C#中使用。

+0

thanx很多@Baboon !!這有助於......我現在大部分工作已經完成並且正在努力,我唯一掙扎的部分是DataGridCell的模板。 TemplateBinding如何在代碼中完成? –

+0

@ChrisjanL我的谷歌搜索發現:http://www.codeproject.com/Tips/240670/WPF-TemplateBinding-in-code。應該工作正常,我猜。 –

+0

過度思考一個簡單的解決方案的經典案例。我在資源字典中使用了這種樣式,可以簡單地使用「this.Style = Application.Current.Resources [typeof(DataGrid)]作爲樣式;」。但是,感謝所有的幫助,如果我需要從代碼背後設置樣式,我對如何實現這一點有了更好的理解! –