最近一个小项目想用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("加载中,请稍后...");
}
}
最终效果如图:
提示:代码中的命名空间手动做了随机修改,具体使用时要留意命名空间。