WPF遮罩層實現
阿新 • • 發佈:2019-02-09
廢話不多說,直接上圖:
上程式碼:
先搞一個基類,方便子窗體複用
public partial class BaseWindow : Window
{
public BaseWindow() : base()
{
this.Closed += Window_Closed;
this.WindowStartupLocation = WindowStartupLocation.CenterOwner;
this.ResizeMode = ResizeMode.NoResize;
}
public void SyncComplete()
{
this.Dispatcher.Invoke(() =>
{
MessageBox.Show(this, "操作完成!", "提示");
});
}
private void Window_Closed(object sender, EventArgs e)
{
//容器Grid
Grid grid = this.Owner.Content as Grid;
//父級窗體原來的內容
UIElement original = VisualTreeHelper.GetChild(grid, 0) as UIElement;
//將父級窗體原來的內容在容器Grid中移除
grid.Children.Remove(original);
//賦給父級窗體
this.Owner.Content = original;
}
public bool? ShowDialog(Window owner)
{
//蒙板
Grid layer = new Grid() { Background = new SolidColorBrush(Color.FromArgb(128, 0, 0, 0)) };
//父級窗體原來的內容
UIElement original = owner.Content as UIElement;
owner.Content = null;
//容器Grid
Grid container = new Grid();
container.Children.Add(original);//放入原來的內容
container.Children.Add(layer);//在上面放一層蒙板
//將裝有原來內容和蒙板的容器賦給父級窗體
owner.Content = container;
this.Owner = owner;
return this.ShowDialog();
}
}
子窗體實現:
XAML
<local:BaseWindow x:Class="Modules.wnd_TimeSync"
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:Modules"
mc:Ignorable="d" WindowStyle="None" AllowsTransparency="True" Background="Transparent"
Title="wnd_TimeSync" Height="20" Width="220" Closed="Window_Closed" >
<StackPanel>
<ProgressBar Name="pb" Height="20" Width="200" Maximum="100"></ProgressBar>
</StackPanel>
</local:BaseWindow>
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace Modules
{
/// <summary>
/// wnd_TimeSync.xaml 的互動邏輯
/// </summary>
public partial class wnd_TimeSync : BaseWindow
{
public wnd_TimeSync()
{
InitializeComponent();
}
public static void ShowDialog(Window owner)
{
//彈出訊息框
wnd_TimeSync box = new wnd_TimeSync();
box.ShowDialog(owner);
}
}
}