C# 最大化时从顶部拖动自定义窗口标题栏不起作用
我有一个自定义标题栏,窗口样式设置为“无”。单击标题栏,我检查是否是双击(窗口最大化和恢复),如果不是双击,我执行C# 最大化时从顶部拖动自定义窗口标题栏不起作用,c#,wpf,window,customization,titlebar,C#,Wpf,Window,Customization,Titlebar,我有一个自定义标题栏,窗口样式设置为“无”。单击标题栏,我检查是否是双击(窗口最大化和恢复),如果不是双击,我执行window.DragMove。这对于侧边和顶部的捕捉效果非常好。但是,当我试图在窗口最大化时拖动它(这通常会使窗口向下恢复),它不会做任何事情。这是我的密码: static Window Window { get { return Application.Current.MainWindow; } } /// <summary> /// Tit
window.DragMove
。这对于侧边和顶部的捕捉效果非常好。但是,当我试图在窗口最大化时拖动它(这通常会使窗口向下恢复),它不会做任何事情。这是我的密码:
static Window Window { get { return Application.Current.MainWindow; } }
/// <summary>
/// TitleBar_MouseDown - Drag if single-click, resize if double-click
/// </summary>
private static void TitleBar_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
{
if (e.ClickCount == 2)
{
AdjustWindowSize();
}
else
{
Window.DragMove();//Here is where I do the drag move
}
}
}
/// <summary>
/// Adjusts the WindowSize to correct parameters when Maximize button is clicked
/// </summary>
internal static void AdjustWindowSize()
{
if (Window.WindowState == WindowState.Maximized)
{
SystemCommands.RestoreWindow(Window);
}
else
{
SystemCommands.MaximizeWindow(Window);
}
}
#region Button Events
/// <summary>
/// CloseButton_Clicked
/// </summary>
public static void Close()
{
SystemCommands.CloseWindow(Window);
}
/// <summary>
/// MaximizedButton_Clicked
/// </summary>
public static void Maximize()
{
AdjustWindowSize();
}
/// <summary>
/// Minimized Button_Clicked
/// </summary>
public static void Minimize()
{
SystemCommands.MinimizeWindow(Window);
}
#endregion
静态窗口{get{return Application.Current.MainWindow;}
///
///标题栏鼠标向下-单击时拖动,双击时调整大小
///
私有静态无效标题栏\u MouseDown(对象发送器,MouseButtonEventArgs e)
{
if(e.ChangedButton==MouseButton.Left)
{
如果(例如,点击次数==2)
{
调整窗口大小();
}
其他的
{
Window.DragMove();//这里是我进行拖动移动的地方
}
}
}
///
///单击“最大化”按钮时,调整窗口大小以更正参数
///
内部静态空隙调整窗口大小()
{
如果(Window.WindowState==WindowState.Maximized)
{
SystemCommands.RestoreWindow(窗口);
}
其他的
{
SystemCommands.MaximizeWindow(窗口);
}
}
#区域按钮事件
///
///单击关闭按钮
///
公共静态无效关闭()
{
SystemCommands.CloseWindow(窗口);
}
///
///单击最大化按钮
///
公共静态无效最大化()
{
调整窗口大小();
}
///
///已单击最小化按钮
///
公共静态void最小化()
{
系统命令。最小化窗口(窗口);
}
#端区
现代UI和MahApps.Metro以某种方式做到了这一点,我简要地查看了它们的源代码,但找不到它们是如何做到的
提前感谢。我能够获得所需的标题栏行为,包括纯xaml中的aero管理单元 因此,您可以看到一个自定义标题栏,它是完全可拖动的,双击可最大化和还原,拖动可捕捉和取消捕捉 xaml
结果
所以现在您不需要任何代码来手动处理标题栏
可重复使用的样式
您还可以将上面的内容包装为自定义样式,可以应用于多个窗口
用法
如何在代码中实现
在查看了您的代码之后,我成功地实现了它,只做了很少的更改
变化是
文件:CustomChrome.cs
第41行:更改标题高度=36,当前为0。这应该等于标题栏的高度
var chrome = new WindowChrome() { GlassFrameThickness = new Thickness(-1), CaptionHeight = 36 };
第60行:删除((框架元素)发送器).MouseDown+=TitleBar\u MouseDown代码>如不需要
第70行:删除不再使用的事件TitleBar\u MouseDown
文件:CornerButtons.xaml
第13行:将WindowChrome.ishitestvisibleinchrome=“True”
添加到StackPanel
<StackPanel SnapsToDevicePixels="True" Orientation="Horizontal" WindowChrome.IsHitTestVisibleInChrome="True">
<cc:CornerButtons Grid.Column="2">
<StackPanel Orientation="Horizontal"
WindowChrome.IsHitTestVisibleInChrome="True">
仅此而已,您的应用程序将有一个正常的标题栏,而无需处理自定义逻辑我尝试过,但它不起作用。那时候它做了一些古怪的事情。你能发布你的应用程序的工作样本吗?我可以在这里试一试吗。你知道怎么做吗?你是否设置了WindowChrome.IshitteTvisibleInChrome=“True”
,这是这些按钮工作所必需的。您也可以单独设置按钮。自定义窗口效果很好,但是当您最大化和最小化窗口时,它会丢失一些动画,它只是突然弹出并隐藏。您知道如何实现默认最小化和最大化效果吗。