2

我有一个 WPF 应用程序(.NET 3.0,VS2008),它在选项卡控件中显示数据。此应用程序中几乎所有控件都需要自定义颜色:基本上是白色前景和绿色背景。

我的问题是,当 XP 主题(比如 Luna)处于活动状态时,它会自动应用于渲染控件,以便我的白色文本写在......白色背景上。例如在活动选项卡项目标题上:不可读的选项卡项目标题

我试过了 :

  • 从生成的应用程序中删除嵌入的清单文件(在项目属性中):没用。
  • 在应用程序资源中强制使用 Windows 经典主题:

    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="/PresentationFramework.Classic;V3.0.0.0;31bf3856ad364e35;component/themes/classic.xaml" />
    </ResourceDictionary.MergedDictionaries>
    

最后一次尝试对所有控件都有效,除了仍然如上显示的选项卡控件。

任何的想法 ?

更新:我怀疑这种行为是由于我必须应用于选项卡控件的自定义样式:

<Window.Resources>
  <Style x:Key="Custom">
    <Setter Property="Control.Background" Value="#FF47C7C8" />
    <Setter Property="Control.Foreground" Value="White" />
  </Style>
  <Style TargetType="TabControl" BasedOn="{StaticResource Custom}" />
</Window.Resources>

那么如何获得带有自定义颜色的经典主题呢?

4

2 回答 2

2

为了确保跨操作系统的一致行为和外观,您最好的选择是重新模板化 TabItem 控件,然后在选择 TabItem 时使用触发器修改新模板的一部分。尝试以下操作:

<Grid>
<Grid.Resources>
  <Style x:Key="Custom">
    <Setter Property="Control.Background" Value="#FF47C7C8"/>
    <Setter Property="Control.BorderBrush" Value="#FF47C7C8"/>
    <Setter Property="Control.Foreground" Value="White"/>
  </Style>
  <Style BasedOn="{StaticResource Custom}" TargetType="TabControl"/>
  <Style TargetType="TabItem">
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type TabItem}">
          <Grid>
            <Border
              Name="Border"
              Background="#FF47C7C8"
              BorderBrush="#FFFFFF"
              BorderThickness="1,1,1,1"
              CornerRadius="2,2,0,0">
              <ContentPresenter
                x:Name="ContentSite"
                HorizontalAlignment="Center"
                Margin="12,2,12,2"
                VerticalAlignment="Center"
                ContentSource="Header"
                RecognizesAccessKey="True"/>
            </Border>
          </Grid>
          <ControlTemplate.Triggers>
            <Trigger Property="IsSelected" Value="True">
              <Setter Property="Panel.ZIndex" Value="100"/>
              <Setter TargetName="Border" Property="Background" Value="#FF47C7C8"/>
              <Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0"/>
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</Grid.Resources>
<TabControl>
  <TabItem Header="Item 1"/>
  <TabItem Header="Item 2"/>
  <TabItem Header="Item 3"/>
  <TabItem Header="Item 4"/>
</TabControl>

好的机会!

于 2009-05-13T14:26:40.293 回答
-1

为什么不使用 WPF Futures 项目中的 WPF 主题! WPF 主题

替代文字 http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpf&DownloadId=62497

于 2009-05-04T13:06:15.657 回答