16

スタイルやテンプレートなどのWPFリソースをどのように整理して、Windows、ページ、さらにはプロジェクト全体で使用できるようにすることができますか。リソースの最大の再利用性と保守可能な構造(たとえば、テンプレートごとに1つのファイル)を実現するには、どのようなオプションが必要ですか?

例:WPFアプリケーションを作成していて、TabControlを使用したいのですが、大きな変更を加えたいと思います。したがって、でスタイルを作成し、それをTabControlとTabItemに適用できます。それは問題ありませんが、Window XAMLを明確に保ち、​​他のWindowsやプロジェクトからもスタイルにアクセスできるようにするためにリソースをどこに配置できますか?

App.xamlに追加できることがわかりましたが、これは1つのプロジェクトの解決策にすぎず、このプロジェクトのアイテム間でのみ共有できます。また、これらのテンプレートをすべてのページまたはapp.xamlに配置するよりも、他のコードから少し分離した方がよいと思いますか?

4

3 に答える 3

40

私は通常、別のスタイリングプロジェクトを作成します。これは、スタイリングしたいプロジェクトから参照します。スタイリングプロジェクトの構造は次のように固定されています。

スタイリングプロジェクト

すべてのコントロールに対して、スタイリングを作成しますResourceDictionary。たとえば、私のボタンの場合:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="PrimaryButtonStyle" TargetType="Button">
    </Style>

    <Style x:Key="ToolbarButton" TargetType="Button">
        <Setter Property="BorderThickness" Value="0" />
        <Setter Property="Margin" Value="3"/>
        <Setter Property="Background" Value="Transparent"></Setter>
    </Style>
</ResourceDictionary>

1つのメインResourceDictionaryで、他のすべての辞書をマージします。この場合は、ファイルIncaDesign.xamlにマージします。これは、上の図で確認できます。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:controls="clr-namespace:Commons.Controls;assembly=Commons">

    <ResourceDictionary.MergedDictionaries>

        <ResourceDictionary Source="Converter/Converter.xaml" />
        <ResourceDictionary Source="Styles/Button.xaml" />
        <ResourceDictionary Source="BitmapGraphics/Icons.xaml" />

    </ResourceDictionary.MergedDictionaries>

    <!-- Default Styles -->
    <Style TargetType="Button" BasedOn="{StaticResource PrimaryButtonStyle}"></Style>
</ResourceDictionary>

特に指定しない限り、自動的に適用されるデフォルトのスタイルをどのように定義したかに注意してください。スタイリングするすべてのウィンドウまたはコントロールで、これを参照するだけで済みますResourceDictionary。アセンブリへの参照であるソースの定義に注意してください(/Commons.Styling;component...

<UserControl.Resources>        
    <ResourceDictionary>            
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Commons.Styling;component/IncaDesign.xaml" />
        </ResourceDictionary.MergedDictionaries>   
    </ResourceDictionary>        
</UserControl.Resources>

デフォルトのスタイルが自動的に設定されるようになりました。リソースに明示的にアクセスする場合は、を使用してこれを行うことができますStaticResource

<Viewbox Height="16" Width="16" Margin="0,0,10,0">
    <ContentControl Content="{StaticResource FileIcon32}" />
</Viewbox>

これは私の意見では非常に優れたソリューションであり、たとえばPRISMで構築されたモジュラーソリューションを含む非常に複雑なソリューションで機能します。

于 2013-03-06T14:19:56.783 に答える
1

AResourceDictionaryはあなたが探しているもののためのものです。

プロジェクト内およびプロジェクト間でそれらを使用する方法の説明は次のとおりです

于 2013-03-06T14:13:15.720 に答える
1

ソリューションまたは別のソリューションのいずれかに、リソースディクショナリを含むプロジェクトを作成できます。プロジェクトはクラスライブラリタイプになり、他のプロジェクトから.dllを簡単に参照できます。これを説明する記事は次のとおりです。リソース辞書の記事

于 2013-03-06T14:13:47.357 に答える