【问题标题】:How can I style the border and title bar of a window in WPF?如何在 WPF 中设置窗口的边框和标题栏?
【发布时间】:2012-04-16 05:34:32
【问题描述】:

我们正在开发一个 WPF 应用程序,该应用程序使用 Telerik 的控件套件,一切正常且看起来不错。不幸的是,我们最近需要替换所有对话框的基类,将 RadWindow 更改为标准 WPF 窗口(原因与此讨论无关)。在这样做的过程中,我们最终得到了一个应用程序,它在所有开发人员的计算机上看起来仍然很漂亮(启用 Aero 的 Windows 7),但在我们的客户端环境中使用时却很难看(Windows Server 2008 R2 下的终端服务)。

Telerik 的 RadWindow 是一个标准的用户控件,它模仿对话框的行为,因此对其进行样式设置不是问题。不过,使用 WPF 的窗口,我很难改变它的“边框”。我在这里所说的“边框”是指带有图标的标题栏和 3 个标准按钮(最小化、最大化/恢复、关闭)和窗口周围的调整大小。

如何更改这些项目的外观:

  • 标题栏颜色
  • 3 个标准按钮
  • 窗口的真实边框颜色

尽可能使用圆角。

【问题讨论】:

    标签: wpf xaml styling


    【解决方案1】:

    这些是“非客户端”区域,由 Windows 控制。 Here is the MSDN docs on the subject(相关信息在顶部)。

    基本上,您设置窗口的 WindowStyle="None",然后构建您自己的窗口界面。 (similar question on SO)

    【讨论】:

    • 您的链接是我一直在搜索但没有找到的。显然,我需要提高我的 Google 技能 ;-)
    • @MarcelGosselin 有人告诉我我的 google-fu 很强大 :) 很高兴我能帮忙
    • 错误答案。首先 RadWindow 不支持 WindowStyle 属性。第二,“类似问题”甚至与 Telerik 控件无关。
    • 我认为这是过时的答案,有一种方法可以做到这一点,请参阅下面的答案。
    【解决方案2】:

    你需要设置

    WindowStyle="None"AllowsTransparency="True" 和可选的ResizeMode="NoResize"
    然后将窗口的Style 属性设置为您的自定义窗口样式,您可以在其中将窗口的外观(标题栏、按钮、边框)设计为您想要的任何内容,并在ContentPresenter 中显示窗口内容。

    This 似乎是一篇关于如何实现这一点的好文章,但互联网上还有很多其他文章。

    【讨论】:

    • 这个code sample 提供了一个示例,说明如何在保留所有默认功能(标题栏、窗口边框、窗口按钮、拖放和调整大小)的同时替换默认样式。
    • WindowStyle="None", AllowsTransparency="True"(你忘记了 Allows 中的 's')
    • 为什么需要更改调整大小模式?这会通过使用键盘(Win + 箭头键)或需要添加它来破坏窗口的任何移动。
    【解决方案3】:

    我从this question 中的@DK 评论中找到了一个更直接的解决方案,该解决方案由 Alex 和 described here 编写并附有源代码, 制作自定义窗口:

    1. 下载样例工程here
    2. 编辑 generic.xaml 文件以自定义布局。
    3. 享受:)。

    【讨论】:

      【解决方案4】:

      诸如“你不能因为只有 Windows 可以控制非客户区”这样的说法并不完全正确——Windows 允许你指定非客户区的尺寸。

      缺点是这只能通过 Windows 的内核方法实现,而且您使用的是 .NET,而不是 C/C++。无论如何,我们可以使用 P/Invoke。实际上,整个 Windows 窗体 UI 和控制台应用程序 I/O 方法都是作为在后台进行系统调用的包装器提供的。因此,正如 MSDN 中所述,完全可以使用 P/Invoke 来访问那些设置非客户区所需的方法。

      但是,这是我很久以前提出的一个比当前更难的解决方案。幸运的是,从 .NET 4.5 开始,您可以使用 WindowChrome 类来调整您想要的非客户区。开始使用herehere,这是根据需要更改窗口边框尺寸的指南。通过将其设置为0,您将能够实现自定义窗口边框来代替系统的边框。

      【讨论】:

        【解决方案5】:

        我建议您从现有解决方案开始并对其进行自定义以满足您的需求,这比从头开始更好!

        我一直在寻找同样的东西,我落入了this开源解决方案,我希望它会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-29
          • 2013-03-03
          • 2011-06-05
          • 1970-01-01
          • 2015-07-02
          • 2011-06-05
          • 1970-01-01
          • 2012-02-13
          相关资源
          最近更新 更多