DynamicResources无法在以编程方式创建的控件中加载

时间:2011-06-20 17:48:03

标签: c# wpf xaml prism dynamicresource

我有一个使用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,但它确实没有多大帮助。

1 个答案:

答案 0 :(得分:0)

非常奇怪的问题,它出现我认为只有依赖属性与继承标志。

如果在RedTextStyle中设置Background属性,它将正常更新。

所以我找到两种方法来解决这个问题:

  1. 在文字元素上使用ClearValue(TextElement.ForegroundProperty)

  2. 或者使用一些默认值为App.xaml添加样式,如下所示:

    <Style x:Key="RedTextStyle" TargetType="TextBlock">
        <Setter Property="Foreground" Value="Black" />
    </Style>