首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF窗口标题栏

WPF窗口标题栏
EN

Stack Overflow用户
提问于 2022-03-05 13:40:30
回答 2查看 1K关注 0票数 0

我看过关于winforms Windows 10上的WinForms暗标题栏中“黑暗模式”标题栏的这篇文章

显然,您可以像这样(在WPF中)获得窗口句柄,而不是使用this.Handle。

代码语言:javascript
复制
IntPtr hWnd = new WindowInteropHelper(GetWindow(this)).EnsureHandle();

所以起作用了

但我想知道我能不能用任何颜色..。

Windows 10和11有一个设置可以打开设置中的任何标题栏颜色,但我想知道我是否可以获得hWnd并自己执行每个应用程序,因为我可以将其变为黑色,为什么不使用其他颜色呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-01 01:10:11

的人一直想知道我是怎么弄到这个的

把这个放在你的班级里

代码语言:javascript
复制
[DllImport("DwmApi")] 
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, int[] attrValue, int attrSize);
const int DWWMA_CAPTION_COLOR = 35;

在什么功能(主要?)

把窗户把手拿来,或者像这样

代码语言:javascript
复制
IntPtr hWnd = new WindowInteropHelper(this).EnsureHandle();

然后定义颜色

代码语言:javascript
复制
int[] colorstr = new int[]{0xFF00FF};

0x字符串的格式如下: 0xRRGGBB将字母替换为相应的值。

那就让它发生

代码语言:javascript
复制
DwmSetWindowAttribute(hWnd, DWWMA_CAPTION_COLOR, colorstr, 4);

注意:这只适用于windows 11。

这是完整的版本,如果你的懒惰

代码语言:javascript
复制
class MainWindow : Window
{

     [DllImport("DwmApi")] 
     private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, int[] attrValue, int attrSize);
     const int DWWMA_CAPTION_COLOR = 35;

     public MainWindow()
     {
          IntPtr hWnd = new WindowInteropHelper(this).EnsureHandle();
          int[] colorstr = new int[]{0xFF00FF};
          DwmSetWindowAttribute(hWnd, DWWMA_CAPTION_COLOR, colorstr, 4);
     }

}

哦,是的,进口这些

代码语言:javascript
复制
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;

编辑:颜色采用BGR格式,所以要确保它是蓝色,绿色,红色,而不是红色,绿色蓝色。

票数 3
EN

Stack Overflow用户

发布于 2022-03-05 14:43:14

你可以用三种方法来解决这个问题..。

1:最困难的是,您要做的是修改由Windows.控制的非客户端区域。

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

如前所述,这是一个“比目前必要的更难”的解决办法。

2:用XAML制作自己的标题栏比较容易

幸运的是,从.NET 4.5开始,您可以使用WindowChrome类在某种程度上调整非客户端区域以满足您的需要,您可以将WindowStyle设置为none,并可以向应用程序添加一个自定义标题栏,该标题栏可以具有您喜欢的任何颜色,并且可以看起来像来自WindowStyle或其他操作系统的标题栏。

要开始学习WindowChrome,您可以访问以下文章:WindowChrome类用WindowChrome进行实验

代码的基础就在<Window [...]>下面

代码语言:javascript
复制
<WindowChrome.WindowChrome>
        <WindowChrome 
        CaptionHeight="0"
        ResizeBorderThickness="5" />
    </WindowChrome.WindowChrome>

并确保添加了WindowStyle="None"以删除标题栏及其组件。

3:最简单的一个,使用第三方库.

您还可以为WPF使用第三方组件系统(如MahApps.Metro )。据我所知,您应该能够自定义标题栏的颜色。

最终结果可以如下所示:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71362654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档