5

比較的初心者が WPF を理解するのを手伝ってくれてありがとう。

WPF アプリケーションの XAML ファイルで次のスタイル テンプレートを使用しようとしています。

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <Style TargetType="{x:Type RowDefinition}"
                        x:Key="hideIfNotDischarged">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding DischargedBy28Days,
                                Mode=OneWay}" Value="false">
                                <Setter Property="Height" Value="0" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                    <Style TargetType="{x:Type RowDefinition}"
                        x:Key="hideIfOutcomeKnownAndAlive">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsKnownDead,
                                Mode=OneWay}" Value="false">
                                <Setter Property="Height" Value="0" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

後で次のようにグリッドで使用されます。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="30" />
        <RowDefinition Style="{StaticResource hideIfNotDischarged}" />
        ...

ただし、Type を対象とする複数のスタイル要素があり、RowDefinitionかつ ALSOResourceDictionary内にネストされている場合 (マージ MergedDictionaryする子が 1 つしかない場合でも)、アプリケーションは次のエラーで失敗します: Item has already been added.ResourceDictionarySystem.Windows.ResourceDictionary.DeferrableContent

つまり、2 つのスタイルが異なるキーを持っているという事実にもかかわらず、リソース ディクショナリは、純粋にターゲット タイプに基づいた名前のディクショナリ アイテムを追加しようとしています (キーは無視されます)。

これを克服する方法についての助けをいただければ幸いです。

4

1 に答える 1

6

Xaml左から右に解析されるので、識別子があることに気付く前に、( x:Key が使用されていない場合はデフォルトの識別子) が存在するかどうResourceDictionaryかをチェックすると思いますMergedDictionariesTargetTypex:Key

x:Keyの前にを設定してみてくださいTargetType

これは、Xaml パーサーのバグであるか、仕様によるものである可能性があります。Microsoft Connect で調べる価値があるかもしれません

于 2013-10-17T03:57:02.307 に答える