控件名:WindowHelpers
作 者:WPFDevelopersOrg -
驚鏵
原文链接
[1]
:https://github.com/WPFDevelopersOrg/WPFDevelopers
1)创建装饰
AdornerContainer
代码如下:
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;
namespace WPFDevelopers.Utilities
public class AdornerContainer : Adorner
private UIElement _child;
public AdornerContainer(UIElement adornedElement) : base(adornedElement)
public UIElement Child
get => _child;
if (value == null)
RemoveVisualChild(_child);
_child = value;
return;
AddVisualChild(value);
_child = value;
protected override int VisualChildrenCount
return _child != null ? 1 : 0;
protected override Size ArrangeOverride(Size finalSize)
_child?.Arrange(new Rect(finalSize));
return finalSize;
protected override Visual GetVisualChild(int index)
if (index == 0 && _child != null) return _child;
return base.GetVisualChild(index);
2)创建蒙板控件 MaskControl
代码如下:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace WPFDevelopers.Controls
public class MaskControl : ContentControl
private readonly Visual visual;
public static readonly DependencyProperty CornerRadiusProperty =
DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(MaskControl),
new PropertyMetadata(new CornerRadius(0)));
public MaskControl(Visual _visual)
visual = _visual;
public CornerRadius CornerRadius
get => (CornerRadius)GetValue(CornerRadiusProperty);
set => SetValue(CornerRadiusProperty, value);
3)创建 WindowHelpers
。
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
using WPFDevelopers.Controls;
using WPFDevelopers.Utilities;
namespace WPFDevelopers.Helpers
public static class WindowHelpers
public static void MaskShow(this Window outputWindow)
CreateMask(outputWindow);
outputWindow.Show();
public static bool? MaskShowDialog(this Window outputWindow)
CreateMask(outputWindow);
return outputWindow.ShowDialog();
public static void CreateMask(this Window outputWindow)
Visual parent = null;
if (Application.Current.Windows.Count > 0)
parent = Application.Current.Windows.OfType<Window>().FirstOrDefault(o => o.IsActive);
var _layer = GetAdornerLayer(parent);
if (_layer == null) return;
var _adornerContainer = new AdornerContainer(_layer)
Child = new MaskControl(parent)
_layer.Add(_adornerContainer);
if (outputWindow != null)
outputWindow.Closed += delegate
if (parent != null)
_layer.Remove(_adornerContainer);
static AdornerLayer GetAdornerLayer(Visual visual)
var decorator = visual as AdornerDecorator;
if (decorator != null)
return decorator.AdornerLayer;
var presenter = visual as ScrollContentPresenter;
if (presenter != null)
return presenter.AdornerLayer;
var visualContent = (visual as Window)?.Content as Visual;
return AdornerLayer.GetAdornerLayer(visualContent ?? visual);
4)创建 MaskExample.xaml
示例代码如下:
<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.MaskExample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:wd="https://github.com/WPFDevelopersOrg/WPFDevelopers"
xmlns:controls="clr-namespace:WPFDevelopers.Samples.Controls"
xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid Margin="10">
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Center">
<Button Content="MaskShowDialog" Click="Button_Click"/>
<Button Content="MaskShowDialog" Margin="10,0" Click="Button_Click_1"/>
</StackPanel>
</Grid>
</UserControl>
5)创建 MaskExample.xaml.cs
示例代码如下:
using System.Windows.Controls;
using WPFDevelopers.Helpers;
namespace WPFDevelopers.Samples.ExampleViews
/// <summary>
/// MaskExample.xaml 的交互逻辑
/// </summary>
public partial class MaskExample : UserControl
public MaskExample()
InitializeComponent();
private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
new AboutWindow().MaskShowDialog();
private void Button_Click_1(object sender, System.Windows.RoutedEventArgs e)
new AboutWindow().MaskShow();
原文链接: https://github.com/WPFDevelopersOrg/WPFDevelopers
WPF 子窗打开时在父窗显示蒙板控件名:WindowHelpers作 者:WPFDevelopersOrg - 驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40;Visual Studio 2022;使用方式需引入命名空间 using WPFDevelopers.Helpers;new AboutWi...
需求与效果
由于界面设计需要,要给弹窗添加蒙板效果,在百度和google搜索了半天,竟然没有一个满意的方案,最后只能自己想办法实现了一个,原理还是比较简单的,现在分享给大家。
先看一下效果。。
原理其实很简单,启动项目的时候,先在主窗体最根部的Grid 添加一个控件,设置好颜色和透明度,隐藏:
首先,一个标准的对话框应该严格具备至少如下特点:
只要背后父窗体显示,它一定会显示,并且覆盖在父窗体之上。 对话框的窗口标题不会显示在任务栏中的,任务栏仅会显示主窗体的名称。 对于模式对话框(Model Dialog),只有对话框关闭后,背后父窗体才会获得焦点。无模式对话框(Modeless Dialog)没有这样的限制。
那么,举个例子,比如记事本中的字体
上代码:先搞一个基类,方便子窗体复用 public partial class BaseWindow : Window
public BaseWindow() : base()
this.Closed += Window_Closed;
this.WindowStartup
2. 在主窗口中添加一个按钮,并给按钮添加一个 Click 事件处理程序。
3. 在 Click 事件处理程序中创建登录窗口的实例,并使用 ShowDialog 方法显示该窗口。
下面是示例代码:
在 MainWindow.xaml 中添加一个按钮:
```xml
<Button Content="登录" Click="LoginButton_Click"/>
在 MainWindow.xaml.cs 中添加 Click 事件处理程序:
```csharp
private void LoginButton_Click(object sender, RoutedEventArgs e)
LoginWindow loginWindow = new LoginWindow();
loginWindow.ShowDialog();
其中,LoginWindow 是登录窗口的类名。ShowDialog 方法会阻止用户与主窗口进行交互,直到登录窗口被关闭。
这样,当用户点击登录按钮时,就会打开登录窗口。