WPF: ContentPresenter неожиданно меняет передний план в зависимости от расположения стилей - PullRequest
3 голосов
/ 03 июня 2010

У меня проблема с ContentPresenter, который неожиданно работает в зависимости от того, расположены ли стили в окне. Ресурсы или в ResourceDictionary. В частности, я устанавливаю передний план TextBlock по умолчанию на черный, а затем устанавливаю значение переднего плана в моем стиле кнопок по умолчанию на белый.

Если на странице есть такие стили, они отлично работают:

<Window
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
 x:Class="TestBed.MainWindow"
 x:Name="Window"
 Title="MainWindow"
 Width="640" Height="480">
 <Window.Resources>
  <Style TargetType="{x:Type TextBlock}">
     <Setter Property="Foreground" Value="Black" />
   </Style>
  <Style x:Key="ButtonFocusVisual">
   <Setter Property="Control.Template">
    <Setter.Value>
     <ControlTemplate>
      <Rectangle Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1" Margin="2" SnapsToDevicePixels="true"/>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
   <GradientStop Color="#F3F3F3" Offset="0"/>
   <GradientStop Color="#EBEBEB" Offset="0.5"/>
   <GradientStop Color="#DDDDDD" Offset="0.5"/>
   <GradientStop Color="#CDCDCD" Offset="1"/>
  </LinearGradientBrush>
  <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
  <Style TargetType="{x:Type Button}">
   <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
   <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
   <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
   <Setter Property="BorderThickness" Value="1"/>
   <Setter Property="Foreground" Value="White"/>
   <Setter Property="HorizontalContentAlignment" Value="Center"/>
   <Setter Property="VerticalContentAlignment" Value="Center"/>
   <Setter Property="Padding" Value="1"/>
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type Button}">
      <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding IsDefaulted}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}">
       <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/>
      </Microsoft_Windows_Themes:ButtonChrome>
      <ControlTemplate.Triggers>
       <Trigger Property="IsKeyboardFocused" Value="true">
        <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/>
       </Trigger>
       <Trigger Property="ToggleButton.IsChecked" Value="true">
        <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
       </Trigger>
       <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Foreground" Value="#ADADAD"/>
       </Trigger>
      </ControlTemplate.Triggers>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
 </Window.Resources>
 <StackPanel x:Name="LayoutRoot">
  <Button Content="Button"  />  
 </StackPanel>
</Window>

Но если я перенесу те же стили в ResourceDictionary, передний план кнопки переключится на черный.

Обновлено главное окно:

<Window
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
 x:Class="TestBed.MainWindow"
 x:Name="Window"
 Title="MainWindow"
 Width="640" Height="480">

 <StackPanel x:Name="LayoutRoot">
  <Button Content="Button" />  
 </StackPanel>
</Window>

ResourceDictionary:

<ResourceDictionary
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
 xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
 mc:Ignorable="d">

  <Style TargetType="{x:Type TextBlock}">
  <Setter Property="Foreground" Value="Black" />
  </Style>
  <Style x:Key="ButtonFocusVisual">
   <Setter Property="Control.Template">
    <Setter.Value>
     <ControlTemplate>
      <Rectangle Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1" Margin="2" SnapsToDevicePixels="true"/>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
   <GradientStop Color="#F3F3F3" Offset="0"/>
   <GradientStop Color="#EBEBEB" Offset="0.5"/>
   <GradientStop Color="#DDDDDD" Offset="0.5"/>
   <GradientStop Color="#CDCDCD" Offset="1"/>
  </LinearGradientBrush>
  <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
  <Style TargetType="{x:Type Button}">
   <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
   <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
   <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
   <Setter Property="BorderThickness" Value="1"/>
   <Setter Property="Foreground" Value="White"/>
   <Setter Property="HorizontalContentAlignment" Value="Center"/>
   <Setter Property="VerticalContentAlignment" Value="Center"/>
   <Setter Property="Padding" Value="1"/>
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type Button}">
      <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding IsDefaulted}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}">
       <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/>
      </Microsoft_Windows_Themes:ButtonChrome>
      <ControlTemplate.Triggers>
       <Trigger Property="IsKeyboardFocused" Value="true">
        <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/>
       </Trigger>
       <Trigger Property="ToggleButton.IsChecked" Value="true">
        <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
       </Trigger>
       <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Foreground" Value="#ADADAD"/>
       </Trigger>
      </ControlTemplate.Triggers>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
</ResourceDictionary>

И мой App.xaml, потому что кто-то попросит его:

<Application
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 x:Class="TestBed.App"
 StartupUri="MainWindow.xaml">
 <Application.Resources>
  <!-- Resources scoped at the Application level should be defined here. -->
  <ResourceDictionary>
   <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="ResourceDictionary.xaml"/>
   </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
 </Application.Resources>
</Application>

Любая помощь будет принята с благодарностью:)

Ответы [ 2 ]

1 голос
/ 01 мая 2012

Просто понял, что я никогда не отвечал на это. Короче говоря, вы всегда должны использовать метки, а не текстовые блоки, потому что текстовые блоки на самом деле не являются элементами управления.

0 голосов
/ 03 июня 2010

Мы говорим, что он ведет себя странно во время разработки или во время выполнения. У меня раньше были проблемы с конструктором Visual Studio ... Особенно с тем, что App.Xaml не работал до того, как я запустился во время выполнения.

...