1

に単純なデフォルト スタイルを提供したいのですがUserControl、コントロールを使用するときにスタイルを拡張またはオーバーライドできます。UserControl以下は、単純なとWindowコントロールを含む のサンプル シナリオです。Buttonで提供されている のスタイルがWindow、 で定義されているデフォルトのスタイルをオーバーライドすることを目的としていますUserControl

ユーザーコントロール

<UserControl x:Class="Sample.TestControl" ... >
    <UserControl.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Margin" Value="2" />
            <Setter Property="Foreground" Value="Orange" />
        </Style>
        <Style TargetType="{x:Type StackPanel}">
            <Setter Property="Background" Value="Black" />
        </Style>
    </UserControl.Resources>
    <StackPanel>
        <Button Content="Press Me" />
        <Button Content="Touch Me" />
        <Button Content="Tap Me" />
    </StackPanel>
</UserControl>

<Window x:Class="Sample.MainWindow" ... >
    <Grid>
        <local:TestControl>
            <local:TestControl.Resources>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Margin" Value="2" />
                    <Setter Property="Foreground" Value="Green" />
                </Style>
            </local:TestControl.Resources>
        </local:TestControl>
    </Grid>
</Window>

問題

上記のコードは次のようになります。

  • 例外:Set property 'System.Windows.ResourceDictionary.DeferrableContent' threw an exception.
  • 内部例外:Item has already been added.

上記のコードは、同じキーを持つ 2 つのスタイルを同じ に送信しようとしているResourceDictionaryため、明らかに機能しません。ボタンにデフォルトのスタイルを提供することはできないと思います...

4

1 に答える 1

0

不十分な回避策:デフォルトをオーバーライドするResourceDictionary

<Window x:Class="Sample.MainWindow" ... >
    <Grid>
        <local:TestControl>
            <local:TestControl.Resources>
                <ResourceDictionary>
                    <Style TargetType="{x:Type Button}">
                        <Setter Property="Margin" Value="2" />
                        <Setter Property="Foreground" Value="Green" />
                    </Style>
                </ResourceDictionary>
            </local:TestControl.Resources>
        </local:TestControl>
    </Grid>
</Window>

カスタムButtonスタイルを に配置するResouceDictionaryことで、デフォルトのスタイルをオーバーライドできます。ただし、Buttonスタイルをオーバーライドするだけでなく、すべてのリソースをオーバーライドします。そのためStackPanel、黒の背景はなくなります。(明らかに、それをオーバーライド スタイルに追加することもできますが、それはより大きなスケールでは実用的ではありません。)

于 2012-10-13T23:14:29.383 に答える