我有一个使用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
<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());
}
当应用程序加载时,第一个实例将具有预期的Red前景,从构造函数添加的那个将是默认的黑色。
有趣的是,如果我将构造函数修改为这样,它就可以工作。
public MainWindow()
{
InitializeComponent();
root.Children.Add(new TestUC());
var x = root.Children[1];
root.Children.RemoveAt(1);
root.Children.Add(x);
}
是否有一个合适的解决方案让这个工作?将资源添加到应用程序资源不起作用,因为我们在同一个应用程序中有其他shell,并且这些资源是特定于shell的。我们可以将资源字典合并到每个视图中并将它们切换到StaticResources,但是有很多视图,所以我们也希望避免使用该解决方案。
更新:找到这个Connect Issue,但它确实没有多大帮助。
答案 0 :(得分:0)
非常奇怪的问题,它出现我认为只有依赖属性与继承标志。
如果在RedTextStyle中设置Background属性,它将正常更新。
所以我找到两种方法来解决这个问题:
在文字元素上使用ClearValue(TextElement.ForegroundProperty)
。
或者使用一些默认值为App.xaml添加样式,如下所示:
<Style x:Key="RedTextStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="Black" />
</Style>