2010-07-29 54 views
4

補充我有被合併到我的主題下面的ResourceDictionary/Generic.xaml文件WPF ResourceDictionary的項目已經使用ComponentResourceKey

<DataTemplate DataType="{x:Type model:RequirementResourceRelation}" x:Key="{x:Static local:Resources.RequirementResourceRelationListTemplateKey}"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="Auto" /> 
     </Grid.ColumnDefinitions> 
     <TextBlock MinWidth="35" HorizontalAlignment="Left" Padding="3,0" Text="{Binding Resource.Name, TargetNullValue=Loading...}" /> 
     <TextBlock Grid.Column="1" Text="-" /> 
     <TextBlock Grid.Column="2" MinWidth="35" HorizontalAlignment="Left" Padding="3,0" Text="{Binding Path=RelationType, TargetNullValue=Loading...}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" /> 
    </Grid> 
</DataTemplate> 

<DataTemplate DataType="{x:Type model:RequirementResourceRelation}" x:Key="{x:Static local:Resources.RequirementResourceRelationListTemplate2Key}"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="Auto" /> 
     </Grid.ColumnDefinitions> 
     <TextBlock MinWidth="35" HorizontalAlignment="Left" Padding="3,0" Text="{Binding Requirement.Name, TargetNullValue=Loading...}" /> 
     <TextBlock Grid.Column="1" Text="-" /> 
     <TextBlock Grid.Column="2" MinWidth="35" HorizontalAlignment="Left" Padding="3,0" Text="{Binding Path=RelationType, TargetNullValue=Loading...}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" /> 
    </Grid> 
</DataTemplate> 

我試圖爲相同的數據類型與創建兩個不同的數據模板不同的ComponentResourceKey。正如你可以看到其中一個鍵附加了一個2。

在我的本地:資源類我有以下是我正在使用的ComponentResourceKey。

public static ComponentResourceKey RequirementResourceRelationListTemplateKey { 
     get { 
      return new ComponentResourceKey(typeof(Resources), "RequirementResourceRelationListTemplate"); 
     } 
    } 

    public static ComponentResourceKey RequirementResourceRelationListTemplate2Key { 
     get { 
      return new ComponentResourceKey(typeof(Resources), "RequirementResourceRelationListTemplate2"); 
     } 
    } 

這個作品,如果我只在那裏的DataTemplates之一,但一旦我添加了第二個,我得到的是說,一個例外:

Item has already been added. Key in dictionary: 'DataTemplateKey(HR.TrackingTool.Model.RequirementResourceRelation)' Key being added: 'DataTemplateKey(HR.TrackingTool.Model.RequirementResourceRelation)' 
    at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) 
    at System.Collections.Hashtable.Add(Object key, Object value) 
    at System.Windows.ResourceDictionary.SetKeys(IList`1 keyCollection, IServiceProvider serviceProvider) 
    at System.Windows.ResourceDictionary.SetDeferrableContent(DeferrableContent deferrableContent) 
    at System.Windows.Baml2006.WpfSharedBamlSchemaContext.<Create_BamlProperty_ResourceDictionary_DeferrableContent>b__168(Object target, Object value) 
    at System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object instance, Object value) 
    at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value) 
    at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value) 

看來,資源字典忽略的關鍵時添加一個DataTemplate。 ResourceDictionary在使用ComponentRelationKey時是否忽略關鍵屬性?

任何解決此異常的方法?

謝謝,勞爾

回答

4

如果通過鍵引用您的DataTemplate,你就不能離開了數據類型規格? 沒有 DataType =「{x:Type model:RequirementResourceRelation}」 (這顯然是添加項目的關鍵)您的x:Key應該被用作關鍵字。

+1

令人敬畏的工作。我已經將此作爲bug提交給Microsoft。 https://connect.microsoft.com/VisualStudio/feedback/details/581761/resource-dictionary-ignores-componentresourcekey-when-adding-a-datatemplate?wa=wsignin1.0 – HaxElit 2010-08-02 14:18:27

+1

此錯誤仍然有效。難以置信!!我將TextBlock的兩種樣式添加到應用程序資源字典中。陷入這個錯誤。完全令人沮喪。我想用我的鍵盤粉碎我的屏幕。微軟吹。期。 – 2013-11-19 10:13:53

+0

這就是說,[這](http://stackoverflow.com/questions/2040804/xaml-mergeddictionaries-throwing-xmlparseexception-item-has-already-been-adde)爲我解決了它。我失去了太多的頭髮。 – 2013-11-19 10:19:32

1

DataTemplate(s)移動到另一個控件的<Resources>元素中。

的Silverlight這只是正常工作:

<ResourceDictionary  
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       > 
    <!--Template 1--> 
    <DataTemplate DataType="VMType" x:Key="Template1"> 
     ... 
    </DataTemplate> 
    <!--Template 2--> 
    <DataTemplate DataType="VMType" x:Key="Template2"> 
     ... 
    </DataTemplate> 
    <!--Control Style, references the two templates above--> 
    <Style TargetType="ControlType"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ControlType"> 
        <Grid Background="White" Margin="0">   
         ... 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

WPF,我不得不搬到控制裏面的3個模板:

<ResourceDictionary  
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       > 
    <Style TargetType="ControlType"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ControlType"> 
        <Grid Background="White" Margin="0">   
         <!--MOVED HERE INSTEAD OF THE ROOT-->    
         <Grid.Resources> 
          <!--Template 1--> 
          <DataTemplate DataType="VMType" x:Key="Template1"> 
           ... 
          </DataTemplate> 
          <!--Template 2--> 
          <DataTemplate DataType="VMType" x:Key="Template2"> 
           ... 
          </DataTemplate> 
         </Grid.Resources> 
         ... 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

現在工作在兩個WPF和Silverlight沒有錯誤。

8

顯然這個問題正如所述,有點。風格聲明的順序很重要。

當兩種樣式對於相同的TargetType所述第一屬性是所述的TargetType例如

<Style TargetType="{x:Type TextBlock}" x:Key="_defaultRuleTextBlockStyle"> 
<Style TargetType="{x:Type TextBlock}" x:Key="_tinySourceCodeTextBlockStyle"> 

然後你得到的錯誤。它似乎忽略Key:屬性,並且如前所述使用TargetType值作爲字典鍵,例如「{X:類型的TextBlock}」

當兩個樣式相同的TargetType的的第一個元素是X:重點,那麼你不這樣做,如下圖所示。

<Style x:Key="_defaultRuleTextBlockStyle" TargetType="{x:Type TextBlock}"> 
<Style x:Key="_tinySourceCodeTextBlockStyle" TargetType="{x:Type TextBlock}"> 

如果你把垃圾移到我猜的沒關係。對智者來說,總是從x:鑰匙開始,但這是一個非常愚蠢的錯誤。

+0

在IMO的最佳答案。如果我堅持了一段時間,懷疑我對WPF的理解。沒有意識到XAML中參數的順序曾經有所不同,但顯然它確實如此。 – apc 2016-06-13 10:37:08

+1

我永遠無法自己弄清楚這一點。做得好! – Steztric 2017-03-06 21:20:32

相關問題