C# 覆盖标题双击

C# 覆盖标题双击,c#,wpf,C#,Wpf,我试图覆盖在我的WPF应用程序中双击标题栏时发生的情况。我已经尝试过研究这个问题,我希望它尽可能简单,因为它是一个小程序,并且不希望包含任何库。我的想法是,我想双击标题栏,窗口的内容将变得隐藏或可见,如果它是隐藏的。我有一个示例应用程序,它实际上改变了一些事情,比如从WPF中绘制标题栏。但是我想不出来,任何帮助都将不胜感激 <Window x:Class="TestWPF.MainWindow" xmlns="http://schemas.microsoft.com/win

我试图覆盖在我的WPF应用程序中双击标题栏时发生的情况。我已经尝试过研究这个问题,我希望它尽可能简单,因为它是一个小程序,并且不希望包含任何库。我的想法是,我想双击标题栏,窗口的内容将变得隐藏或可见,如果它是隐藏的。我有一个示例应用程序,它实际上改变了一些事情,比如从WPF中绘制标题栏。但是我想不出来,任何帮助都将不胜感激

<Window x:Class="TestWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" ResizeMode="NoResize" WindowStyle="None">
    <WindowChrome.WindowChrome>
        <WindowChrome CaptionHeight="{Binding ActualHeight,ElementName=Titlebar}"/>
    </WindowChrome.WindowChrome>
    <DockPanel LastChildFill="True">
        <Border Background="DarkGray" DockPanel.Dock="Top" Height="25" x:Name="Titlebar">
            <TextBlock Text="{Binding Title, RelativeSource={RelativeSource FindAncestor,AncestorType=Window},FallbackValue=Title}" 
                       Margin="10,0,0,0"
                       VerticalAlignment="Center">
                <TextBlock.Effect>
                    <DropShadowEffect Color="White" ShadowDepth="3"/>
                </TextBlock.Effect>
            </TextBlock>
        </Border>
        <Border BorderBrush="LightGray" BorderThickness="1" Padding="4" x:Name="Content">
            <TextBlock Text="Window content" x:Name="Text"/>
        </Border>
    </DockPanel>
</Window>

好吧,多亏了汉斯·帕桑,我对他提到的内容进行了深入研究,并找到了答案。您需要将以下内容添加到源代码中

private const int WM_NCLBUTTONDBLCLK = 0x00A3;

protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);
    HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
    source.AddHook(WndProc);
}

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == WM_NCLBUTTONDBLCLK)
    {
        //Do stuff here
    }

    return IntPtr.Zero;
}

这应该只在“无客户端”区域中双击时触发,但正如他所提到的,它不会正常显示,因为没有人希望双击标题栏会做一些不同的事情。我之所以想要它,是因为我需要一种简单的方法来隐藏窗口的内容,并将其折叠到标题栏上,因为您实际上无法调整我的窗口的大小。

当您双击它时,当前会发生什么?看起来您的
窗口
没有真正的标题栏,只有一个
边框
,里面有一个
文本块
。如果您想在双击
边框
文本块
时发生一些事情,您应该能够为该事件添加事件处理程序。很抱歉,如果我尝试将任何事件添加到“标题栏”边框或其任何子项,则根本不会触发。我不知道该如何让它发挥作用。因此,如果我执行了
操作,它将不会调用
Titlebar\u MouseDown
方法。这不会直接在WPF中公开,您必须拦截Windows生成的WM\u双击通知。HwndSourceHook.AddHook()是必需的。它没有公开,因为从来没有人期望它能以不同的方式工作。非常感谢你提出这个问题。展示了一些研究成果,非常有用