【问题标题】:WPF datagrid different style depending on OSWPF datagrid 不同的样式取决于操作系统
【发布时间】:2015-04-04 08:18:35
【问题描述】:

我正在开发一个在内部使用一些 WPF 用户控件的 WinForms 应用程序。其中一个包含 WPF DataGrid,我可以根据其运行的操作系统以不同的样式查看它。

在 Win7/Win8 中,我看到它的方式相同(Win 8 中的上下文菜单选项比 Win 7 中的高度更高),但在 Windows Server 2008 中,它似乎在标题行中使用了完全不同的 ui 样式。

Windows 8:

Windows 服务器 2008:

在网上搜索了一下,好像是用不同的UI来源。我尝试手动放置黑色前景的白色背景,但它失去了“渐变”样式,我不喜欢创建整个手动样式的想法。

有什么帮助吗?

/////////////////////////////////////// //////////////////////

//////////////////// 已更新 ///////////// /////////

/////////////////////////////////////// //////////////////////

我拆分了问题并创建了一个具有最简单数据网格的 exe(一列和一个上下文菜单项)。当我在 Windows server 2008 中运行 exe 时颜色正常,这真是令人惊讶!!!

最后,我最终找到了导致显示丑陋蓝色的原因。当在一行上按下鼠标右键时,我使用它来强制数据网格保持“蓝色”。如果我不使用这种样式,当我右键单击它时,该行将显示为灰色。

<Style x:Key="DataGridStyle1" TargetType="{x:Type DataGrid}">        
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{DynamicResource {x:Static SystemColors.HighlightColorKey}}" />
        </Style.Resources>
 </Style>

选定的行(确定):

右击行(坏):

在 Windows Server 2008 中右键单击的行带有导致颜色不佳的样式(黑色字符而不是白色 --> 我想保留白色字符):

你知道如何使用数据网格样式来获得我需要的东西吗?

【问题讨论】:

  • 你可能会在this thread找到一些有用的信息
  • 如何只为 Windows Server 创建一个样式并在检查 Environment.OSVersion 后应用它?
  • @GordonTrue,你告诉我的线程包含在 Windows 服务器上启用 Windows 用户体验的指南。在我的机器上解决问题会很好,但当我在 500 台客户端机器上安装应用程序时就不值得了。我不想依赖客户端:(
  • @NadiaCibrikova 嗯,很有趣,但我对那个属性有点困惑。对于 win8 机器,属性值为“Microsoft Windows NT 6.2.9200.0”,对于 server2008,其值为“Microsoft Windows NT 6.1.7601 Service Pack 1”。我认为依赖字符串比较不是一个好习惯。你如何检查我是否在 win 服务器上运行??

标签: c# wpf winforms datagrid styles


【解决方案1】:

您可以使用数字而不是字符串来检查版本:

Version win2008version = new Version(6, 1, 7601, 0);
if(Environment.OSVersion.Version == win2008version ) ...

如果您仍需要确定当前版本,您可以使用产品编号(Win7 为 1,Win2008 为 3)来区分 Win7 和 Win2008。你可以打电话给GetProductInfo

[System.Runtime.InteropServices.DllImport("Kernel32.dll")]
internal static extern bool GetProductInfo(
int osMajorVersion,
int osMinorVersion,
int spMajorVersion,
int spMinorVersion,
out int ProdunctNum); 

GetProductInfo(
Environment.OSVersion.Version.Major,
Environment.OSVersion.Version.Minor,
0,
0,
out ProdunctNum); 

【讨论】:

    【解决方案2】:

    我意识到不仅标题受到干扰,例如上下文菜单也受到干扰。

    不是逐个元素设置特定样式,并根据操作系统应用它们,是否可以告诉 WPF“尝试为每个组件使用 Aero 样式!”???​​

    PS:我检查了不同操作系统上的版本:

    • Windows 服务器 2008:6.1.7601 SP 1
    • Windows 7:6.1.7601 SP 1
    • Windows 8.1:6.2.9200.0

    这样在 Win 2008 和 Win 7 上是一样的!! :(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 2017-02-18
      • 2012-07-22
      • 2020-09-15
      • 2020-05-11
      相关资源
      最近更新 更多