最简单的完整解决方案
您好,以下解决方案以最简单的方式解决了您问题中详述的所有问题,并且可以在使用 WPF 和最新版本的 C# 语言和 .NET 框架的 Windows 10 上运行。这是截至 2017 年 3 月 15 日。如果它停止工作,请告诉我。
第 1 步:要解决问题 1、2 和 4,请<Window ... > </Window>
在应用程序 XAML 的标记中,将其粘贴到顶部或底部:
<WindowChrome.WindowChrome>
<WindowChrome CaptionHeight="35"/>
<WindowChrome.WindowChrome>
CaptionHeight
是您的窗口拖动区域的所需高度。
第 2 步:要解决问题 3,您需要创建标题栏和标题以及窗口控件。为此,您只需为每个所需的标题栏元素提供一个顶部的 VerticalAlignment,或者将它们放入一个将 VerticalAlignment 设置为顶部的网格中,这将为所有这些元素执行此操作,但请确保它们的高度不是大于第 1 步中在 XAML 中声明CaptionHeight
的元素的属性WindowChrome
。对于所有按钮,您必须为它们或它们的容器分配属性WindowChrome.IsHitTestVisibleInChrome="True"
。这是一个例子:
<Grid VerticalAlignment="Top" Background="White" Name="TitleBar" Height="35">
<Label Content="Borderless Window Test" VerticalAlignment="Center" HorizontalAlignment="Left"/>
<StackPanel WindowChrome.IsHitTestVisibleInChrome="True" VerticalAlignment="Center" HorizontalAlignment="Right" Orientation="Horizontal" Name="WindowControls">
<Button Height="35" Width="35" Content="-" Padding="0" Name="MinimizeButton"/>
<Button Height="35" Width="35" Content="+" Padding="0" Name="MaximizeButton"/>
<Button Height="35" Width="35" Content="x" Padding="0" Name="CloseButton"/>
</StackPanel>
</Grid>
现在,要向窗口控制按钮添加适当的功能,请在MainWindow()
代码隐藏的构造函数中,即应用程序的 C# 源代码中,在调用后将以下内容粘贴到InitializeComponent();
:
CloseButton.Click += (s, e) => Close();
MaximizeButton.Click += (s, e) => WindowState = WindowState == WindowState.Normal ? WindowState.Maximized : WindowState.Normal;
MinimizeButton.Click += (s, e) => WindowState = WindowState.Minimized;
第 3 步:要解决问题 5 和 6,您需要连接到 WmGetMinMaxInfo。为此,请转到您的代码隐藏,然后将此Pastebin中的所有内容复制并粘贴到您的 Window 类中。现在,在您的MainWindow()
构造函数中,粘贴:
SourceInitialized += (s, e) =>
{
IntPtr handle = (new WindowInteropHelper(this)).Handle;
HwndSource.FromHwnd(handle).AddHook(new HwndSourceHook(WindowProc));
};
通过Project > Add References
在文件菜单中,请务必参考:
System.Management
System.Windows.Interop
System.Security.Principal
System.Runtime.InteropServices
Microsoft.Win32
最好的检查方法是单击Assemblies
左上角的选项卡,然后选择Framework
,然后使用窗口右上角的搜索框。现在将所有这些使用(命名空间)添加到代码隐藏的顶部:
using System.Management;
using System.Windows.Interop;
using System.Security.Principal;
using System.Runtime.InteropServices;
using Microsoft.Win32;
那应该涵盖所有内容。我希望这有帮助!