WPFユーザーコントロールでインポートされたリソースとローカルリソースを組み合わせる方法


82

共有リソースと個別リソースの両方を必要とするいくつかのWPFユーザーコントロールを作成しています。

別のリソースファイルからリソースをロードするための構文を理解しました。

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
</UserControl.Resources>

ただし、これを行うと、次のようにリソースをローカルに追加することもできません。

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
    <!-- Doesn't work: -->
    <ControlTemplate x:Key="validationTemplate">
        ...
    </ControlTemplate>
    <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
        ...
    </style>
    ...
</UserControl.Resources>

ResourceDictionary.MergedDictionariesを見てきましたが、それでは複数の外部ディクショナリをマージすることしかできず、ローカルでそれ以上のリソースを定義することはできません。

些細なことを見逃しているに違いありませんか?

言及する必要があります:私はWinFormsプロジェクトでユーザーコントロールをホストしているので、App.xamlに共有リソースを配置することは実際にはオプションではありません。

回答:


157

私はそれを考え出した。解決策にはMergedDictionariesが含まれますが、詳細は次のように適切である必要があります。

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- This works: -->
        <ControlTemplate x:Key="validationTemplate">
            ...
        </ControlTemplate>
        <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
            ...
        </style>
        ...
    </ResourceDictionary>
</UserControl.Resources>

つまり、ローカルリソースはResourceDictionaryタグにネストする必要があります。したがって、ここでの例は正しくありません。


5

MergedDictionariesセクション内でローカルリソースを定義できます。

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <!-- import resources from external files -->
            <ResourceDictionary Source="ViewResources.xaml" />

            <ResourceDictionary>
                <!-- put local resources here -->
                <Style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
                    ...
                </Style>
                ...
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

5

MergedDictionariesを使用します

ここから次の例を取得し ました。

File1

<ResourceDictionary 
  xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation "
  xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml " > 
  <Style TargetType="{x:Type TextBlock}" x:Key="TextStyle">
    <Setter Property="FontFamily" Value="Lucida Sans" />
    <Setter Property="FontSize" Value="22" />
    <Setter Property="Foreground" Value="#58290A" />
  </Style>
</ResourceDictionary>

ファイル2

   <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="TextStyle.xaml" />
        </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary> 

ありがとう、でも運がない。彼の例は正しいように見えますが、実際には機能しません。「プロパティ 'リソース'が複数回設定されています」というメッセージが表示されます。
Tor Haugen

MergedDictionariesについて知っています。しかし、外部の辞書参照をローカルで定義されたリソースと希望どおりに組み合わせることができません。すでに述べたように、あなたが参照しているページに例がありますが、それは機能しません。
Tor Haugen

2
「複数回設定」エラーが発生した場合:他のすべてのリソースは、最初の<ResourceDictionary>タグ内にある必要があります。
Hexo 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.