.NET4 WPF - сеттер стилей для переднего плана, работающий только после элемента управления «скрыть / показать» - PullRequest
0 голосов
/ 04 июля 2011

У меня проблема с определенным стилем WPF, который называется HeadText с TargetType = "TextBlock".Стиль определяет Foreground, FontSize и Effect.При первом отображении TextBlock только установщик переднего плана не запускается (цвет текста остается черным), FontSize и Effect применяются нормально.Когда я удаляю TextBlock из parent и возвращаю его обратно, передний план также изменяется, как и должно быть.

Ситуация:

Сборка Presenter.dll

  • класс Presenter: Window, загружает и отображает мои пользовательские элементы управления.
  • Generic.xaml - словарь ресурсов, содержащий стили.
  • Presenter.dll напрямую не ссылается на TestPresentable.dll.

TestPresentable.dll сборка

  • TestPresentable: UserControl, имеет стиль TextBlock.
  • TestPresentable.dll напрямую не ссылается Presenter.dll.

MainApp.exe

  • ссылается на обапредыдущие сборки
  • создает MainWindow из Presenter.dll сборки,
  • создает TestPresentable из TestPresentable сборки,
  • устанавливает MainWindow.ContentHost.Content = testPresentable

Соответствующий код:

Presenter.dll

// Themes/Generic.xaml
...
<Style TargetType="{x:Type TextBlock}" x:Key="HeadText">
    <Setter Property="Foreground" Value="#FFFFFFFF" />
    <Setter Property="Effect">
        <Setter.Value>
            <DropShadowEffect ShadowDepth="0" Color="#79000000" BlurRadius="3" Opacity="1" />
        </Setter.Value>
    </Setter>
    <Setter Property="FontSize" Value="24"/>
</Style>
...


// MainWindow.xaml
...
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Presenter.dll;component/Themes/Generic.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <ContentPresenter Name="ContentHost"/>
</Grid>
...

TestPresentable.dll

// TestPresentable.xaml
...
<TextBlock Text="{Binding SomeData}" Style="{DynamicResource HeadText}"/>
...

Ответы [ 2 ]

7 голосов
/ 04 июля 2011

Кажется, что что-то странное с TextBlock.Foreground в WPF начиная с 3.5, см .:

Я нашел обходной путь, используя EventSetters и некоторый код для ResourceDictionary. Это не красиво, но придется делать, если я хочу, чтобы мои стили были независимы от основного приложения. Я опубликую это здесь, так как это может быть кому-то полезно, и я оставлю вопрос открытым, если кто-то отправит правильный (или лучший) ответ.

Обход

В XAML ResorceDictionary (например, Generic.xaml) добавьте свойство Class следующим образом:

<!-- Generic.xaml -->
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Presenter.Themes.Generic">

Затем добавьте файл codebehind cs (например, Generic.xaml.cs) с частичным классом, указанным в свойстве Class в ResourceDictionary:

// Generic.xaml.cs
partial class Generic { }

В соответствующем стиле ResourceDictionary добавьте EventSetter для события Loaded:

<!-- Generic.xaml -->
<Style TargetType="{x:Type TextBlock}" x:Key="HeadText">
    <EventSetter Event="Loaded" Handler="OnHeadTextLoaded"/>
    <Setter .../>
    <Setter .../>
    <Setter .../>
</Style>

В Generic.xaml.cs добавить обработчик для события Loaded и установить желаемый Foreground

//Generic.xaml.cs
public void OnHeadTextLoaded(object sender, EventArgs args)
{
    var textBlock = sender as TextBlock;
    if (textBlock == null) return;
    textBlock.Foreground = new SolidColorBrush(Colors.White);
}
1 голос
/ 17 мая 2012

У меня похожая проблема с цветом переднего плана, который не тянет при первой загрузке страницы.Я обнаружил, что в моем случае, если вы жестко закодируете свойство FontFamily в файле xaml, в котором находится TextBlock, то цвет переднего плана правильно корректируется в первый раз.

Если вы простопоместите свойство FontFamily в таблицу стилей, тогда TextBlock снова будет просто черным в первый раз.

например

// TestPresentable.xaml

...
Style="{DynamicResource HeadText}" **FontFamily="Arial"**... 
...