【问题标题】:How to disable XP themes in WPF application?如何在 WPF 应用程序中禁用 XP 主题?
【发布时间】:2009-05-04 13:00:45
【问题描述】:

我有一个在选项卡控件中显示数据的 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>

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

【问题讨论】:

    标签: wpf windows-xp themes tabcontrol


    【解决方案1】:

    为了确保跨操作系统的一致行为和外观,最好的办法是重新模板化 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>
    

    机会来了!

    【讨论】:

    【解决方案2】:

    【讨论】:

    • 因为这些主题都不符合我的要求。无论如何感谢您的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多