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”
,这是这些按钮工作所必需的。您也可以单独设置按钮。自定义窗口效果很好,但是当您最大化和最小化窗口时,它会丢失一些动画,它只是突然弹出并隐藏。您知道如何实现默认最小化和最大化效果吗。