控件名:WindowHelpers

作   者:WPFDevelopersOrg - 驚鏵

原文链接 [1] :https://github.com/WPFDevelopersOrg/WPFDevelopers

  • 框架使用 .NET40

  • Visual Studio 2022 ;

  • 使用方式需引入命名空间 using WPFDevelopers.Helpers;

    • new AboutWindow().MaskShowDialog(); ,即可显示蒙板,并 ShowDialog 开窗体。

    • new AboutWindow().MaskShow(); ,即可显示蒙板,并 MaskShow 开窗体。

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 方法会阻止用户与主窗口进行交互,直到登录窗口被关闭。 这样,当用户点击登录按钮,就会打开登录窗口。