当前位置:  开发笔记 > 编程语言 > 正文

如何创建一个没有边框的WPF窗口,只能通过夹点调整大小?

如何解决《如何创建一个没有边框的WPF窗口,只能通过夹点调整大小?》经验,为你挑选了4个好方法。

如果您ResizeMode="CanResizeWithGrip"在WPF上设置,Window则右下角会显示调整大小的手柄,如下所示:

如果你设置Window了标题栏,标题栏会消失,但灰色斜角边缘会保留,直到你设置为止ResizeMode="NoResize".不幸的是,通过设置这种属性组合,调整大小的抓握也会消失.

我通过习惯覆盖了Window's' .我想自己指定窗口的边框,我不需要用户能够从四面调整窗口大小,但我确实需要调整大小.ControlTemplateStyle

有人可以详细说明满足所有这些标准的简单方法吗?

    Window除了我指定的那个之外,没有边界ControlTemplate.

    在右下角工作调整大小的抓地力.

    没有标题栏.

ZombieSheep.. 173

如果AllowsTransparencyWindow(即使没有设置任何透明度值)上设置属性,边框将消失,您只能通过夹点调整大小.



    


结果如下:

尽管如此,AllowTransparency有几个失败,Windows无法再承载子窗口控件,例如WebBrowser,通常强制软件渲染,报告了内存泄漏.请参阅下面的解决方法. (3认同)

哇,我不希望这样,但是它在5分钟内制作你自己的便利贴纸非常方便,谢谢:) (2认同)

@Grault thats摆脱了窗口标题,但是窗体周围仍然有一个实心边框。AllowsTransparency摆脱了边界。 (2认同)


小智.. 69

我试图创建一个无边框窗口 Window但是当我测试它时,似乎在顶部出现了一个白色条,经过一些研究它似乎是一个"调整边框",这里是一个图像(我用黄色标记):

挑战

经过对互联网的一些研究,以及许多困难的非xaml解决方案,我发现的所有解决方案都是C#代码和许多代码行,我在这里间接找到了解决方案:最大自定义窗口失去阴影效果


    

注意 :您需要使用.NET 4.5框架,或者如果您使用的是旧版本,则使用WPFShell,只需引用shell并使用Shell:WindowChrome.WindowChrome.

我使用了WindowChromeWindow 的属性,如果使用它,白色的"resize border"会消失,但是你需要定义一些属性才能正常工作.

CaptionHeight:这是标题区域(标题栏)的高度,允许Aero快照,双击行为作为普通标题栏.将其设置为0(零)以使按钮工作.

ResizeBorderThickness:这是窗口边缘的厚度,您可以在此处调整窗口大小.我把它放到5,因为我喜欢这个数字,因为如果你把零放在一边很难调整窗口的大小.

使用这个短代码后,结果如下:

解决方案

而现在,白色的边框消失了,而无需使用ResizeMode="NoResize"AllowsTransparency="True",也它显示在窗口中的影子.

稍后我将解释如何使用简单和简短的代码轻松地工作按钮(我没有使用按钮的图像),我是新的,我认为我可以发布到codeproject,因为在这里我没有找到这个地方发布教程.

也许还有另一个解决方案(我知道像我这样的新手有困难和困难的解决方案),但这适用于我的个人项目.

这是完整的代码



    


    

    
    

谢谢!



1> ZombieSheep..:

如果AllowsTransparencyWindow(即使没有设置任何透明度值)上设置属性,边框将消失,您只能通过夹点调整大小.



    


结果如下:


尽管如此,AllowTransparency有几个失败,Windows无法再承载子窗口控件,例如WebBrowser,通常强制软件渲染,报告了内存泄漏.请参阅下面的解决方法.
哇,我不希望这样,但是它在5分钟内制作你自己的便利贴纸非常方便,谢谢:)
@Grault thats摆脱了窗口标题,但是窗体周围仍然有一个实心边框。AllowsTransparency摆脱了边界。

2> 小智..:

我试图创建一个无边框窗口 Window但是当我测试它时,似乎在顶部出现了一个白色条,经过一些研究它似乎是一个"调整边框",这里是一个图像(我用黄色标记):

挑战

经过对互联网的一些研究,以及许多困难的非xaml解决方案,我发现的所有解决方案都是C#代码和许多代码行,我在这里间接找到了解决方案:最大自定义窗口失去阴影效果


    

注意 :您需要使用.NET 4.5框架,或者如果您使用的是旧版本,则使用WPFShell,只需引用shell并使用Shell:WindowChrome.WindowChrome.

我使用了WindowChromeWindow 的属性,如果使用它,白色的"resize border"会消失,但是你需要定义一些属性才能正常工作.

CaptionHeight:这是标题区域(标题栏)的高度,允许Aero快照,双击行为作为普通标题栏.将其设置为0(零)以使按钮工作.

ResizeBorderThickness:这是窗口边缘的厚度,您可以在此处调整窗口大小.我把它放到5,因为我喜欢这个数字,因为如果你把零放在一边很难调整窗口的大小.

使用这个短代码后,结果如下:

解决方案

而现在,白色的边框消失了,而无需使用ResizeMode="NoResize"AllowsTransparency="True",也它显示在窗口中的影子.

稍后我将解释如何使用简单和简短的代码轻松地工作按钮(我没有使用按钮的图像),我是新的,我认为我可以发布到codeproject,因为在这里我没有找到这个地方发布教程.

也许还有另一个解决方案(我知道像我这样的新手有困难和困难的解决方案),但这适用于我的个人项目.

这是完整的代码



    


    

    
    

谢谢!



3> Wobbles..:

虽然接受的答案是非常正确的,但只想指出AllowTransparency有一些垮台.它不允许显示子窗口控件,即WebBrowser,它通常会强制软件渲染,这可能会产生负面的性能影响.

但是有一个更好的工作.

如果要创建一个没有可调整大小的边框的窗口,并且能够托管WebBrowser控件或指向URL的框架控件,那么所述控件的内容将显示为空.

我发现了一个解决方法; 在Window中,如果你将WindowStyle设置为None,ResizeMode设置为NoResize(忍受我,你仍然可以在完成后重新调整大小)然后确保你有UNCHECKED AllowTransparency你将有一个没有边框的静态大小的窗口并将显示浏览器控件.

现在,您可能仍希望能够调整大小吗?好吧,我们可以通过互操作来实现:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();

    //Attach this to the MouseDown event of your drag control to move the window in place of the title bar
    private void WindowDrag(object sender, MouseButtonEventArgs e) // MouseDown
    {
        ReleaseCapture();
        SendMessage(new WindowInteropHelper(this).Handle,
            0xA1, (IntPtr)0x2, (IntPtr)0);
    }

    //Attach this to the PreviewMousLeftButtonDown event of the grip control in the lower right corner of the form to resize the window
    private void WindowResize(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown
    {
        HwndSource hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
        SendMessage(hwndSource.Handle, 0x112, (IntPtr)61448, IntPtr.Zero);
    }

瞧,WPF窗口没有边框,仍然可以移动和调整大小,而不会失去与WebBrowser等控件的兼容性


以下是其他wParam值,只需根据需要将新事件分配给新UI对象`private enum ResizeDirection {Left = 61441,Right = 61442,Top = 61443,TopLeft = 61444,TopRight = 61445,Bottom = 61446,BottomLeft = 61447,BottomRight = 61448,}`
@CJK是的,但毫无疑问你可以将Windows消息挂钩并处理它.

4> 小智..:

样品在这里:



您应该包含代码如何工作的简要说明.
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有