1

いくつかのリソース ディクショナリを含むユーザー コントロール ライブラリがあります。コード:

<ResourceDictionary   ... >
    <LinearGradientBrush x:Key="MyButtonBackground" EndPoint="0.5,1" StartPoint="0.5,0">
        <GradientStop Color="#FF654073" Offset="0.084"/>
        <GradientStop Color="#FF8A6093" Offset="0.929"/>
    </LinearGradientBrush>


    <Style x:Key="MyButtonStyle" TargetType="{x:Type MyButton}" >
        <Setter Property="Background" Value="{StaticResource ResourceKey=MyButtonBackground}" />
        <Setter Property="Foreground" Value="White" />
    </Style>
</ResourceDictionary>

次に、リソース ディクショナリをロードするクラスを作成します。基本的:

return (ResourceDictionary)Application.LoadComponent(new System.Uri("/MyAssembly;component/Themes/Default.xaml", System.UriKind.Relative))

さて、UserControl クラスで、ResourceDictionary を取得した後、Style を直接ロードしたいと思います。どうやってやるの?

this.Style = ((Style)MyResourceDictionary["MyButtonStyle"]); // Don't work

でも:

this.Background = ((Brush)MyResourceDictionary["MyButtonBackground"]);   // Works
4

1 に答える 1

0

最初の例外で発生する例外は何ですか? あなたの説明に基づいて、thisが の場合、適用しようとしている は にのみ適用されるUserControlため、例外が発生します。StyleMyButton

WPFでカスタムを作成しようとしている場合Control(これは a とはかなり異なるアプローチですUserControl)、必要以上の作業を行っています。

まず、カスタム コントロールをクラス (XAML ページなし) として作成します。

public class MyButton : Button
{
    static MyButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(MyButton),
            new FrameworkPropertyMetadata(typeof(MyButton)));  
    }
}

そして、あなたのからRessourceDictionaryを削除します:x:KeyStyle

<Style TargetType="{x:Type MyButton}" >
    <Setter Property="Background" Value="{StaticResource ResourceKey=MyButtonBackground}" />
    <Setter Property="Foreground" Value="White" />
</Style>

最後に、テーマ ディクショナリResourceDictionaryに含める必要があります。Project_Root\Themes\generic.xamlその場合、コードからリソースを取得する必要はまったくありません。

さらに読むために、CodeProjectには、カスタム WPF コントロールを作成するための非常に優れたチュートリアルがあります。

于 2013-08-12T15:16:03.543 に答える