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