如何使用 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" 控件:
您应该更改 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 中解释的那样。
我有一个 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" 控件:
您应该更改 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 在他的 AppBar
, you may want to take a look at Github.WpfAppBar or better check your options in this answer C# Window Docking 中解释的那样。