WPF 类似jquery blockUI的遮罩Loading加载效果

最近一个小项目想用WPF重写一下,需要一个类似Jquery 的blockUI的遮罩层,在后台执行任务的过程中显示Loading...

网上找了一圈,很难找到一个可以现成使用的。最终在基于网上资料的基础上,稍微改造了一下。下面附上代码:

(此方案基于网络搜索获得,感谢提供对应方案的网友们)

1)新建一个BaseWindow.cs类文件  

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace xxx.yyy.zzz
{
    public class BaseWindow : Window
    {
        private string layerGridName = "layerGrid";
        public BaseWindow()
        {
        }
        public void ShowMask(string message)
        {
            var form = Application.Current.MainWindow;

            //蒙板
            Grid layer = new Grid() { Background = new SolidColorBrush(Color.FromArgb(128, 0, 0, 0)) };
            TextBlock tx = new TextBlock();
            tx.Text = string.IsNullOrEmpty(message) ? "加载中..." : message;
            tx.Padding = new Thickness(10, 5, 10, 5);
            tx.Background = new SolidColorBrush(Colors.White);
            tx.HorizontalAlignment = HorizontalAlignment.Center;
            tx.VerticalAlignment = VerticalAlignment.Center;
            layer.Children.Add(tx);

            //父级窗体原来的内容

            UIElement original = form.Content as UIElement;
            form.Content = null;

            //容器Grid
            Grid container = new Grid();
            container.Name = layerGridName;
            container.Children.Add(original);//放入原来的内容
            container.Children.Add(layer);//在上面放一层蒙板

            form.Content = container;
        }

        public void CloseMask()
        {
            try
            {
                var form = Application.Current.MainWindow;

                Grid grid = form.Content as Grid;

                if (grid != null && grid.Name == layerGridName)
                {
                    //父级窗体原来的内容
                    UIElement original = VisualTreeHelper.GetChild(grid, 0) as UIElement;

                    //将父级窗体原来的内容在容器Grid中移除
                    grid.Children.Remove(original);

                    form.Content = original;
                }
            }
            catch
            {
            }
        }
    }
}

2)MainWidow窗体xaml文件中,使用<local:BaseWindow代替Window

<local:BaseWindow x:Class="xxx.yyy.zzz.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:xxx.yyy.zzz" 
        mc:Ignorable="d" 
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="64">
            窗体内容
        </TextBlock>        
    </Grid>
</local:BaseWindow>

3)MainWidow窗体文件后台代码中,继承改成BaseWindow

调用方式就是:ShowMask("xxx");

关闭遮罩就是:CloseMask();

    public partial class MainWindow : BaseWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void BaseWindow_Loaded(object sender, RoutedEventArgs e)
        {
            ShowMask("加载中,请稍后...");
        }
    }

最终效果如图:

提示:代码中的命名空间手动做了随机修改,具体使用时要留意命名空间。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值