2011-06-20 70 views
3

我有一個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,但它確實沒有多大幫助。

回答

0

很奇怪的問題,它出現我認爲只有在繼承標誌的依賴屬性。

如果您在RedTextStyle中設置Background屬性,它將正常更新。

所以我覺得兩種方法來解決這個問題:文本元素

  1. 使用ClearValue(TextElement.ForegroundProperty)上。

  2. 還是要App.xaml中添加的風格有些默認值,就像這樣:

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