2015-11-11 62 views
0

我已经创建了与已经用于其内部运作定义的资源一个DataGrid一个用户控件:现在如何在已有资源的WPF组件上设置XAML中的资源?

 <DataGrid.Resources> 
      <Style TargetType="{x:Type DataGridColumnHeader}"> 
       <Setter Property="ContentTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="23" /> 
            <ColumnDefinition Width="*" /> 
           </Grid.ColumnDefinitions> 
           <Button x:Name="ExcelFilterButton" 
             Grid.Column="0" 
             Margin="0,0,0,0" 
             BorderThickness="0" 
             Click="ExcelFilterButton_Click" 
             Focusable="False" 
             Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" 
             Tag="{Binding}"> 
            <Image Width="19" 
              Height="19" 
              Source="Resources\NoSortNoFilter.png" 
              Tag="{Binding}" /> 
           </Button> 
           <TextBlock Grid.Column="1" 
              HorizontalAlignment="Center" 
              VerticalAlignment="Center" 
              Text="{Binding}" /> 
          </Grid> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </DataGrid.Resources> 

,而试图在应用程序中使用的组件,并与下面的XAML

      <adg:AdvancedSortFilterDataGrid.Resources> 
           <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="{x:Static SystemColors.HighlightColor}" /> 
           <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="{x:Static SystemColors.HighlightTextColor}" />         
          </adg:AdvancedSortFilterDataGrid.Resources> 
设置一些颜色

获取我下面的运行时错误:

'Set property 'System.Windows.ResourceDictionary.DeferrableContent' threw an exception.' Line number '200' and line position '34'. 

我试图用资源属性的组件,只需添加资源到现有资源,但获得相同的错误。这里的属性:

Public Shadows Property Resources As ResourceDictionary 
    Get 
     Return dataGrid.Resources 
    End Get 
    Set(value As ResourceDictionary) 
     For Each Key As Object In value.Keys 
      dataGrid.Resources.Add(Key, value(Key)) 
     Next 
    End Set 
End Property 

希望有人能让我直接。

编辑:的InnerException:

Cannot re-initialize ResourceDictionary instance. 

回答

0

好吧,看来我发现StackOverflow的答案。不知道为什么我在最初的搜索中没有找到这些。无论如何,我发现如果我将资源放在组件和使用应用程序中的ResourcesDictionary元素中,并将ResourcesDictionary元素放入组件中的MergedDictionaries元素内,它就可以正常工作。

组件:

 <DataGrid.Resources> 
      <ResourceDictionary> 
       <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary> 
         <Style TargetType="{x:Type DataGridColumnHeader}"> 
          <Setter Property="ContentTemplate"> 
           <Setter.Value> 
            <DataTemplate> 
             <Grid> 
              <Grid.ColumnDefinitions> 
               <ColumnDefinition Width="23" /> 
               <ColumnDefinition Width="*" /> 
              </Grid.ColumnDefinitions> 
              <Button x:Name="ExcelFilterButton" 
                Grid.Column="0" 
                Margin="0,0,0,0" 
                BorderThickness="0" 
                Click="ExcelFilterButton_Click" 
                Focusable="False" 
                Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" 
                Tag="{Binding}"> 
               <Image Width="19" 
                 Height="19" 
                 Source="Resources\NoSortNoFilter.png" 
                 Tag="{Binding}" /> 
              </Button> 
              <TextBlock Grid.Column="1" 
                 HorizontalAlignment="Center" 
                 VerticalAlignment="Center" 
                 Text="{Binding}" /> 
             </Grid> 
            </DataTemplate> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </ResourceDictionary> 
       </ResourceDictionary.MergedDictionaries> 
      </ResourceDictionary> 
     </DataGrid.Resources> 

使用应用程序:

      <adg:AdvancedSortFilterDataGrid.Resources> 
           <ResourceDictionary> 
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="{x:Static SystemColors.HighlightColor}" /> 
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="{x:Static SystemColors.HighlightTextColor}" /> 
           </ResourceDictionary> 
          </adg:AdvancedSortFilterDataGrid.Resources> 

我改变了资源属性的组件的新ResourcesDictionary添加到MergedDictionaries。

Public Shadows Property Resources As ResourceDictionary 
    Get 
     If dataGrid.Resources.MergedDictionaries.Count < 2 Then 
      Return Nothing 
     Else 
      Return dataGrid.Resources.MergedDictionaries(1) 
     End If 
    End Get 
    Set(value As ResourceDictionary) 
     Do Until dataGrid.Resources.MergedDictionaries.Count = 1 
      dataGrid.Resources.MergedDictionaries.RemoveAt(1) 
     Loop 
     dataGrid.Resources.MergedDictionaries.Add(value) 
    End Set 
End Property 

现在它工作正常。这太简单了,看不到。