Prism を使用してプログラムで多数のビューをインスタンス化し、それらをリージョンに追加する WPF (3.5) アプリケーションがあります。私が見ている問題は、DynamicResources として適用されるビュー内のスタイルが、ビューが最初に表示されたときに適用されないことです。画面を変更して戻ると、適切にロードされます。これは、コントロールのロードとアンロードが原因であることはほぼ確実です。
失敗するスタイルは、ルート ビューで定義されているものです。ルート ビューは子ビューと同じクラス ライブラリにあり、それらをアプリケーション リソースに追加することはできませんが、問題は解決しているようです。
サンプル アプリケーションで問題を再現しました。
<Window x:Class="ProgrammaticDynamicResourceProblem.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:ProgrammaticDynamicResourceProblem"
Height="350" Width="525">
<Window.Resources>
<Style x:Key="RedTextStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="Red" />
</Style>
</Window.Resources>
<StackPanel x:Name="root">
<l:TestUC /> <!-- Will have a foreground of Red -->
</StackPanel>
</Window>
サンプル ユーザー コントロール
<UserControl x:Class="ProgrammaticDynamicResourceProblem.TestUC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TextBlock Text="Test Text" Style="{DynamicResource RedTextStyle}" />
</UserControl>
MainWindow コンストラクターで、TestUC の別のインスタンスを追加します。
public MainWindow()
{
InitializeComponent();
root.Children.Add(new TestUC());
}
アプリケーションが読み込まれると、最初のインスタンスの前景は予想どおり赤になり、コンストラクターから追加されたものはデフォルトの黒になります。
興味深いことに、コンストラクターを次のように変更すると、機能します。
public MainWindow()
{
InitializeComponent();
root.Children.Add(new TestUC());
var x = root.Children[1];
root.Children.RemoveAt(1);
root.Children.Add(x);
}
これを機能させるための適切な解決策はありますか?同じアプリケーションに他のシェルがあり、これらのリソースはシェル固有であるため、リソースをアプリケーション リソースに追加しても機能しません。リソース ディクショナリを各ビューにマージして StaticResources に切り替えることもできますが、ビューの数がかなり多いため、その解決策も避けたいと考えています。
更新:このConnect Issueが見つかりましたが、実際にはあまり役に立ちませんでした。