2010-06-03 75 views
3

我遇到的問題是,根據樣式是否位於窗口中,ContentPresenter的行爲意外。資源或ResourceDictionary中。具體來說,我將默認TextBlock的前景設置爲黑色,然後將默認按鈕樣式中的前景值設置爲白色。WPF:ContentPresenter意外地根據樣式所在的位置更改Foreground

如果存在樣式像這樣的頁面上,他們很好地工作:

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

任何幫助將不勝感激:)

回答

0

我們是否在說它的行爲奇怪的設計時間或運行時間。我之前遇到過Visual Studio設計師的問題......特別是在我運行之前,App.Xaml沒有工作。

+0

對不起,我可能不太清楚這個問題 - 這是在運行時。如果樣式位於窗口上,則該按鈕的文本顏色按預期工作並且是白色的。一旦我將它移出窗口並放入ResourceDictionary中,文本就會變黑。 – VLTII 2010-06-03 19:25:39

1

剛纔意識到我從來沒有回答過這個問題。簡短版本是你應該總是使用標籤而不是文本塊,因爲文本塊實際上不是控件。

+0

感謝您的信息,我一直在努力改變我的自定義數據網格的前景色 – noobie 2013-06-26 09:39:22