DynamicResources не удается загрузить в программно созданный элемент управления - PullRequest
3 голосов
/ 20 июня 2011

У меня есть приложение 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

<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 , но это действительно не сильно помогло.

1 Ответ

0 голосов
/ 17 января 2012

Очень странная проблема, и она возникает, я думаю, только в зависимости от свойств с флагом наследования.

Если вы установите свойство Background в RedTextStyle, оно будет обновляться нормально.

Итак, я нахожу два способа решения этой проблемы:

  1. Используйте ClearValue(TextElement.ForegroundProperty) для текстового элемента.

  2. Или добавьте стиль в App.xaml с некоторым значением по умолчанию, например:

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