Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 最大自定义窗口丢失阴影效果_Wpf_Vb.net_Xaml_Window - Fatal编程技术网

Wpf 最大自定义窗口丢失阴影效果

Wpf 最大自定义窗口丢失阴影效果,wpf,vb.net,xaml,window,Wpf,Vb.net,Xaml,Window,我有一个自定义WPF窗口,定义为: <Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" MinHeight="300" Height="350" MinWidth="600" Widt

我有一个自定义WPF窗口,定义为:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" MinHeight="300" Height="350" MinWidth="600" Width="700"      ResizeMode="CanResizeWithGrip" AllowsTransparency="True" WindowStyle="None">

我在网上找到了一个创建阴影的类,如下所示。即使使用调整大小夹点,这也能很好地工作,直到我将窗口最大化。一旦我最大化了窗口或更改了另一个窗口(如Visual Studio)的窗口状态,我就失去了阴影,无法恢复。有什么想法吗


放置阴影类:

公共类DropShadow
私有共享_handleras EventHandler=新的EventHandler(窗口的地址_SourceInitialized)
_
私有共享函数DwmSetWindowAttribute(hwnd作为IntPtr,attr作为Integer,ByRef attrValue作为Integer,attrSize作为Integer)作为Integer
端函数
_
私有共享函数dwmextendframeintoclienterea(hWnd作为IntPtr,ByRef pMarInset作为边距)作为整数
端函数
公共共享子DropShadowToWindow(窗口作为窗口)
如果不是DropShadow(窗口),则
AddHandler window.SourceInitialized,\u处理程序
AddHandler window.SizeChanged,新的SizeChangedEventHandler(WindowsSizeChanged的地址)
如果结束
端接头
私有共享子窗口\u SourceInitialized(发送方作为对象,e作为事件参数)
将窗口变暗为窗口=DirectCast(发送方,窗口)
DropShadow(窗口)
RemoveHandler window.SourceInitialized,\u处理程序
端接头
私有共享函数DropShadow(窗口作为窗口)作为布尔值
尝试
将辅助对象变暗为新窗口Interophelper(窗口)
Dim val为整数=2
Dim ret1为整数=DwmSetWindowAttribute(helper.Handle,2,val,4)
如果ret1=0,则
用{_
.Bottom=0_
.左=0_
.Right=0_
.Top=0_
}
Dim ret2作为整数=DwmExtendFrameIntoClientArea(helper.Handle,m)
返回ret2=0
其他的
返回错误
如果结束
特例
'可能找不到dwmapi.dll(不兼容的操作系统)
返回错误
结束尝试
端函数
私有共享子窗口SizeChanged(发件人作为对象,e作为SizeChangedEventArgs)
将窗口变暗为窗口=DirectCast(发送方,窗口)
DropShadow(窗口)
端接头
末级

要在能够重新调整窗体大小的同时创建阴影效果,请尝试以下操作:

<DropShadowEffect BlurRadius="5" Color="Black" Opacity="0.8" ShadowDepth="0.5" />
  • 在窗口上设置以下属性:

    • ResizeMode=“CanResizeWithGrip”
    • AllowTransparency=“True”
    • WindowStyle=“无”
    • 背景=“透明”
    • BorderThickness=“3”
  • 在窗口声明之后,添加一个
    边框
    元素

  • 在边框内创建一个
    边框。效果
    元素
  • 对于边框效果,添加以下内容:

    <DropShadowEffect BlurRadius="5" Color="Black" Opacity="0.8" ShadowDepth="0.5" />
    
    
    
  • 这将创建以下内容(右上角没有控制框):

    完整XAML:

    <Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" MinHeight="500" Height="350" MinWidth="300" Width="700" ResizeMode="CanResizeWithGrip" AllowsTransparency="True" WindowStyle="None" Background="White" BorderThickness="3">
    <Border>
        <Border.Effect>
            <DropShadowEffect BlurRadius="5" Color="Black" Opacity="0.8" ShadowDepth="0.5" />
        </Border.Effect>
                          <!-- Put your content in here -->
    </Border>
    </Window>
    

    所以我找到了一种方法让它工作

    您需要使用WPFShell集成库()来完成这项工作。正如MS所写的,他们已经修复了(似乎)对P/Invoke代码的任何问题

    因此,很容易获得一个没有Aero玻璃的窗口,该窗口的边缘可以调整大小,有一个与Aero snap行为一致的标题区域,并且有一个在min/maxing后重新出现的阴影

    这是我的窗口的代码(注意,您需要引用Microsoft.Windows.Shell

    
    
    是为互操作设置所有不同变量的地方

    • CaptionHeight
      :这是标题区域(标题栏)的高度,允许像普通标题栏一样进行航空捕捉和双击
    • GlassFrameThickness
      :出于某种原因将其设置为
      0,0,0,1
      ,将删除镀铬(玻璃),保留方形边框,并添加阴影
    • ResizeBorderThickness
      :这是窗口边缘的厚度,您可以在此调整窗口的大小
    需要注意的其他事项是,保持Window.WindowStyle属性等于
    SingleBorderWindow
    ,并让Shell库处理删除标题、按钮和其他chrome的问题

    所以我有点浪费了我的赏金,但这看起来是一个完全可行的解决方案,效果不错

    编辑:

    以下是结果的图片:


    我还在上建立了一个示例项目。这是麻省理工学院的许可证,人们可以随心所欲地使用它。

    这里有一些简单的代码,可以满足您的需求

    
    
    此窗口的行为与普通窗口类似,因为它可以是:

    • 通过其边缘调整大小
    • 在标题区域内拖动
    • 右键单击标题区域以显示系统菜单
    • 通过双击标题区域最大化/恢复
    • 通过拖动或使用热键捕捉到屏幕两侧(Win 10)
    它也有一个阴影


    最终结果如下所示:


    调试时,DropShadow的第一个返回值是什么?如果返回False,则事件处理程序将无法连接,并且在调整其大小时DS将消失。它正确设置了处理程序。我已经决定删除它,并尝试一种不同的方式。我将在稍后发布我的方式…谢谢你的补充回答。你能贴一张代码的图片来展示它最后的样子吗。将帮助其他返回此线程的人:)当然。。。我会尽快拍一张照片。@StuartBlackler:我添加了图像和一个示例项目的链接。请注意,如果您不想看到夹点,可以使用ResizeMode的CanResize选项。现在您不需要
    Microsoft.Windows.Shell
    软件包。该类位于
    PresentationFramework.dll
    as
    System.Windows.Shell.WindowChrome
    中。这些选项对我不起作用。。。斯图尔特·布莱克勒加利福尼亚州