我有一個WPF(3.5)應用程序使用Prism編程實例化若干視圖,然後將它們添加到一個區域。我看到的問題是視圖內部的樣式被應用爲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>
在主窗口的構造我添加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,但它確實沒有多大幫助。