3

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が見つかりましたが、実際にはあまり役に立ちませんでした。

4

1 に答える 1

0

非常に奇妙な問題であり、継承フラグを持つ依存関係プロパティでのみ考えられるようです。

RedTextStyle で Background プロパティを設定すると、正常に更新されます。

したがって、この問題を解決するには2つの方法があります。

  1. ClearValue(TextElement.ForegroundProperty)テキスト要素で使用します。

  2. または、次のように、デフォルト値を使用して App.xaml にスタイルを追加します。

    <Style x:Key="RedTextStyle" TargetType="TextBlock">
        <Setter Property="Foreground" Value="Black" />
    </Style>
    
于 2012-01-17T18:32:38.347 に答える