22

カスタム コントロールを作成するクラス ライブラリ アセンブリを作成し、generic.xaml ファイルで既定のスタイルを定義しました。

多くの人が投稿している限り、これは非常に一般的な問題のようです。しかし、私の場合、有用な答えが見つかりませんでした。

  • generic.xaml は Themes フォルダーにあります。
  • Generix.xaml ファイルの Build Action は Page に設定されています。
  • ThemeInfo は AssemblyInfo.cs で適切に定義されています。

テスト アプリケーションで、カスタム コントロール アセンブリの generic.xaml ファイルをアプリケーションの App.xaml ファイルに手動でマージすると、次のようになります。

<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="/MyControlsAssembly;component/Themes/generic.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>

カスタム コントロールは適切にテーマ化されますが、generic.xaml を手動でマージしないと、コントロールは既定の Windows テーマで表示されます。

私が何を忘れているか、および/または間違っているか教えてください。

追加情報:

  • 私の ThemeInfo アセンブリ属性は次のように定義されています。

    [assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)]

    (注: 結果は、ThemeInfo 属性のパラメーターをどのように組み合わせても同じです)

  • Themes フォルダーには、generic.xaml ファイルの他に 2 つの .xaml ファイルがあります。

  • Themes フォルダーには、別の .xaml ファイルを含むサブフォルダーがあります。
4

5 に答える 5

13

カスタム コントロール コンストラクターに次の行が必要です。

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

次に、themes フォルダー内に generic.xaml ファイルがある場合、次のサンプル スタイルを使用します。

<Style TargetType="{x:Type local:MyCustomControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyCustomControl}">
                <Border>
                    <Label>Testing...</Label>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

これで、余分なマージなしでスタイルが自動的に適用されます。

于 2013-09-01T18:26:21.547 に答える