WPF:ContentPresenter根据样式的位置意外更改前景

WPF:ContentPresenter根据样式的位置意外更改前景,wpf,xaml,styles,foreground,contentpresenter,Wpf,Xaml,Styles,Foreground,Contentpresenter,基于样式是否位于窗口中,ContentPresenter的行为异常,我遇到了一个问题。资源或在资源字典中。具体来说,我将默认文本块的前景设置为黑色,然后将默认按钮样式中的前景值设置为白色 如果页面上存在这样的样式,则它们可以正常工作: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml

基于样式是否位于窗口中,ContentPresenter的行为异常,我遇到了一个问题。资源或在资源字典中。具体来说,我将默认文本块的前景设置为黑色,然后将默认按钮样式中的前景值设置为白色

如果页面上存在这样的样式,则它们可以正常工作:

<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
 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>


任何帮助都将不胜感激:)

我们是说它在设计时还是在运行时表现得很奇怪。我以前和Visual Studio设计师有过一些问题。。。尤其是应用程序.Xaml在运行时之前不起作用。

刚刚意识到我从未回答过这个问题。简短的版本是,您应该始终使用标签而不是文本块,因为文本块实际上不是控件。

对不起,我可能对这个问题不够清楚-这是在运行时。如果样式在窗口上,则按钮的文本颜色按预期工作,为白色。一旦我将其移出窗口并放入ResourceDictionary,文本就会变成黑色。感谢您提供的信息,我一直在努力更改自定义dataGrid的前景色