質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

3385閲覧

UserControl.Resourcesに定義されたテンプレート定義をResourceDictionaryに移動すると実行時に例外エラーが発生する

mikupedia

総合スコア159

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/09/15 10:14

###前提・実現したいこと
UserControlのResourceでいくつかのControlTemplateを定義しています。
ここでは2つのテンプレートを用意して、それぞれ複数のTextBlockが配置されるようにして文字色を赤、青になるようにしています。
TextBlockのスタイルを一括で設定するためにKeyを設定せず、TargetTypeのみ設定しています。

これを別のUserControlでも参照できるようにResourceDictionaryへ移動したところ
実行時にキーの重複登録の例外エラーとなってしまいました。
デザイナでは問題なく意図した表示になります。
ResourceDictionaryではこのようなやり方はダメなのでしょうか?

XAML

1<UserControl.Resources> 2 <ControlTemplate x:Key="ContentTemplate1" TargetType="{x:Type ContentControl}"> 3 <ControlTemplate.Resources> 4 <Style TargetType="TextBlock"> 5 <Setter Property="Foreground" Value="Red"> 6 </Style> 7 </ControlTemplate.Resources> 8 <StackPanel> 9 <!--たくさんのTextBlockがあったとして一括でスタイルを適用したい--> 10 <TextBlock Text="Text"/> 11 <TextBlock Text="Text"/> 12 <TextBlock Text="Text"/> 13 <StackPanel> 14 </ControlTemplate> 15 <ControlTemplate x:Key="ContentTemplate2" TargetType="{x:Type ContentControl}"> 16 <ControlTemplate.Resources> 17 <Style TargetType="TextBlock"> 18 <Setter Property="Foreground" Value="Blue"> 19 </Style> 20 </ControlTemplate.Resources> 21 <StackPanel> 22 <!--たくさんのTextBlockがあったとして一括でスタイルを適用したい--> 23 <TextBlock Text="Text"/> 24 <TextBlock Text="Text"/> 25 <TextBlock Text="Text"/> 26 <StackPanel> 27</ControlTemplate> 28</UserControl.Resources> 29 30<StackPanel> 31 <ContentControl Template={StaticResource ContentTemplate1}/> 32 <ContentControl Template={StaticResource ContentTemplate2}/> 33</StackPanel>

###発生している問題・エラーメッセージ

例外がスローされました: 'System.Windows.Markup.XamlParseException' (PresentationFramework.dll の中) "項目は既に追加されています。辞書のキー: 'System.Windows.Controls.TextBlock' 追加されるキー:'System.Windows.Controls.TextBlock'"

###該当のソースコード

XAML

1<ResourceDictionary> 2 <ResourceDictionary.MergedDictionaries> 3 <ResourceDictionary> 4 <!--ここに先ほどのContentTemplate1とContentTemplate2を移す--> 5 </ResourceDictionary> 6 </ResourceDictionary.MergedDictionaries> 7<ResourceDictionary>

###補足情報(言語/FW/ツール等のバージョンなど)
VisualStudio2015(VB) Community
.Network Framework 4.6.2(WPF)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

回答ではありません。
試してみましたがダメっぽいですねぇ。。

XAML

1<StackPanel.Resources> 2 <Style TargetType="TextBlock"> 3 <Setter Property="Foreground" Value="Blue"/> 4 </Style> 5</StackPanel.Resources>

のようにしてもダメなので、MergedDictionaries配下のResourceDictionary内でResourcesの記述はダメなのかもしれません(バグっぽいですよね。。)

代わりと言ってはなんですが、リソースファイルを作成し、それをMergedDictionariesするのは大丈夫みたいです。

XAML

1<Application.Resources> 2 <ResourceDictionary> 3 <ResourceDictionary.MergedDictionaries> 4 <!-- MyContentTemplate.xaml に ContentTemplate1とContentTemplate2を移す--> 5 <ResourceDictionary Source="MyContentTemplate.xaml" /> 6 </ResourceDictionary.MergedDictionaries> 7 </ResourceDictionary> 8</Application.Resources>

投稿2017/09/19 00:41

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikupedia

2017/09/20 09:31

ebiryo 様 ご回答ありがとうございます。 いろいろ調べてみてはいますが、仕様なのかバグなのかはっきりしませんね。 ファイル数が多くなってしまいますが、とりあえず教えていただいた方法で対応しようと思います。 MSのコミュニティに似たような質問があったので載せておきます。 https://social.msdn.microsoft.com/Forums/ja-JP/14c6f299-f683-42a0-aafa-5696b1a430f6/mergeddictionariesstyle?forum=wpfja
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問