已使用ComponentResourceKey添加了WPF ResourceDictionary项

Hax*_*lit 5 wpf exception resourcedictionary componentresourcekey

我有以下ResourceDictionary,它被合并到我的Themes/Generic.xaml文件中

<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>
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用不同的ComponentResourceKey为相同的DataType创建两个不同的数据模板.正如您所看到的,其中一个键附加了一个2.

在我的本地:Resources类我有以下是我正在使用的ComponentResourceKey.

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

    public static ComponentResourceKey RequirementResourceRelationListTemplate2Key {
        get {
            return new ComponentResourceKey(typeof(Resources), "RequirementResourceRelationListTemplate2");
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我在其中只有一个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)
Run Code Online (Sandbox Code Playgroud)

似乎ResourceDictionary在添加DataTemplate时忽略了键.ResourceDictionary在使用ComponentRelationKey时是否忽略key属性?

有什么办法解决这个例外吗

谢谢,劳尔

All*_*len 10

显然问题就像所说的那样.风格声明的顺序很重要.

当同一TargetType的两个样式的第一个属性是TargetType时,例如

<Style TargetType="{x:Type TextBlock}" x:Key="_defaultRuleTextBlockStyle">
<Style TargetType="{x:Type TextBlock}" x:Key="_tinySourceCodeTextBlockStyle">
Run Code Online (Sandbox Code Playgroud)

然后你得到错误.它似乎忽略了Key:属性,并且如上所述使用TargetType值作为字典键,例如"{x:Type TextBlock}"

当同一TargetType的两个样式的第一个元素是x:Key时,则不会,如下所示.

<Style x:Key="_defaultRuleTextBlockStyle" TargetType="{x:Type TextBlock}">
<Style x:Key="_tinySourceCodeTextBlockStyle" TargetType="{x:Type TextBlock}">
Run Code Online (Sandbox Code Playgroud)

如果你移动垃圾我没想要的.对明智的人来说,总是从x:Key开始,但这是一个非常愚蠢的错误.

  • 我永远无法自己解决这个问题。做得好! (2认同)

Sim*_* D. 5

如果您通过键引用DataTemplate,就不能只留下DataType规范吗?如果没有DataType =“ {x:Type model:RequirementResourceRelation}”(显然是添加项的键),则应将x:Key用作键。