如何使用 C# 和 WPF 实现位于顶部并减少工作 space 区域的 window?

How to implement a window that sits on top and reduces the working space area, using C# and WPF?

我有一个 WPF window 声明如下

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MyWindow"
    Height="800" Width="200"
    BorderThickness="0"
    WindowStyle="None"
    AllowsTransparency="False"
    ResizeMode="CanResizeWithGrip"
    Topmost="True"
    Background="#fff59d"
    ShowInTaskbar="False">

    <WindowChrome.WindowChrome>
        <WindowChrome CaptionHeight="0" ResizeBorderThickness="5" />
    </WindowChrome.WindowChrome>
</Window>

在这个 window 中有一堆对齐的按钮,使 window 成为一个很好的工具栏,位于另一个 windows.

之上

现在我想将它对齐到屏幕边缘(底部、左侧、顶部、右侧),以便屏幕的工作区域减少 window 的区域。就像 Windows 任务栏发生的情况一样:当其他 windows 最大化并且任务栏始终位于顶部时,任务栏覆盖的区域不会被使用。

非常感谢任何帮助!

编辑

我正在添加一张图片以更好地解释我的问题:

我有兴趣将我的 WPF window 放置在边缘上,以便 window 的区域禁止其他 windows。

您应该检查 "GridSplitter" 控件:

https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/how-to-resize-columns-with-a-gridsplitter

您应该更改 window(toolbar) 以使其成为 UserControl,这样您就可以将其插入另一个 window,所有边缘(底部、左侧、顶部、右侧)都带有 GridSplitter。至于 "snap" 部分,我认为你必须相应地处理拖放事件和 hide/show gridsplitters 以及 show/hide 或 add/remove UserControl(你的工具栏)在 GridSplitter 后面。

抱歉,我没有提供太多实施细节,我相信还有很多工作要做。

如果有人知道更好的方法,我会对另一种解决方案非常感兴趣。

我知道 Telerik 库(不是免费的)提供了一个控件 https://docs.telerik.com/devtools/wpf/controls/raddocking/overview2

首先使用 Top="0" Left="0" 将 "nice tool bar window" 对齐到屏幕的上边缘和左边缘。其次使用事件Window_Loaded设置window高度等于屏幕高度减去任务栏高度这样就不会在上面了。

旁注Title对你的情况没有意义

XAML:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Width="200"
    BorderThickness="0"
    WindowStyle="None"
    AllowsTransparency="False"
    ResizeMode="CanResizeWithGrip"
    Topmost="True"
    Top="0"
    Left="0"
    Loaded="Window_Loaded"
    Background="#fff59d"
    ShowInTaskbar="False">

    <WindowChrome.WindowChrome>
        <WindowChrome CaptionHeight="0" ResizeBorderThickness="5"/>
    </WindowChrome.WindowChrome>
</Window>

代码隐藏:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
  double TaskBarHeight = SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Height;
  Height = SystemParameters.PrimaryScreenHeight - TaskBarHeight;
}

编辑

正如@Bradley_Uffner 在他的 you need an AppBar, you may want to take a look at Github.WpfAppBar or better check your options in this answer C# Window Docking 中解释的那样。