Avalonia ShowDialog 主視窗 半透明遮罩 實作
Avalonia ShowDialog 主視窗 半透明遮罩 實作
資料來源:chatgpt
方案01. 透過主視窗隱藏一個覆蓋全螢幕方式來實現
MainWindow
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="全螢幕主視窗"
WindowState="Maximized">
<Grid>
<!-- 主內容 -->
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Content="顯示子視窗" Click="OnShowDialogClick"/>
</StackPanel>
<!-- 半透明遮罩 -->
<Border Name="OverlayMask"
Background="Black"
Opacity="0.5"
IsVisible="False"/>
</Grid>
</Window>
using Avalonia.Controls;
namespace AvaloniaFullScreenExample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public void ShowOverlayMask(bool show)
{
OverlayMask.IsVisible = show;
}
private async void OnShowDialogClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
var dialog = new DialogWindow();
await dialog.ShowDialog(this);
}
}
}
DialogWindow
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="子視窗"
Width="600" Height="300">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="這是子視窗" Margin="0,0,0,10"/>
<Button Content="關閉" Click="OnCloseClick"/>
</StackPanel>
</Window>
using Avalonia.Controls;
namespace AvaloniaFullScreenExample
{
public partial class DialogWindow : Window
{
public DialogWindow()
{
InitializeComponent();
}
protected override void OnOpened(EventArgs e)
{
base.OnOpened(e);
// 顯示父視窗的遮罩
if (Owner is MainWindow mainWindow)
{
mainWindow.ShowOverlayMask(true);
}
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
// 隱藏父視窗的遮罩
if (Owner is MainWindow mainWindow)
{
mainWindow.ShowOverlayMask(false);
}
}
}
}
方案02. 製作一個半透明Window來實現
OverlayWindow
<Window xmlns="https://github.com/avaloniaui"
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"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="VPOS_Avalonia.OverlayWindow"
Background="Gray"
Opacity="0.3"
Title="OverlayWindow">
</Window>
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace VPOS_Avalonia;
public partial class OverlayWindow : Window
{
public OverlayWindow()
{
this.WindowState = WindowState.FullScreen;
//隱藏工具列
this.ExtendClientAreaToDecorationsHint = true;
this.ExtendClientAreaTitleBarHeightHint = -1;
this.SystemDecorations = SystemDecorations.None;
//---隱藏工具列
InitializeComponent();
}
}
ExternalPopup
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
using VPOS;
namespace VPOS_Avalonia.Views
{
public class ExternalPopup
{
public static MainWindow mainWindow = null;//0
public static Payment payment = null;//1
public static Login login = null;//2
public static Loading loading = null;//3
public static InvoiceCarrier invoiceCarrier = null;//4
public static ClosingHandover closingHandover = null;//7
public static ExpenseList expenseList = null;//8
public static OrderInquiry orderInquiry = null;//13
public static OrderPrint orderPrint = null;//14
public static async Task ProductSpecification(int index, string StrTitle, List<product_Var> product, bool blnPackaging = false)
{
// 創建並顯示遮罩視窗
OverlayWindow _overlay = new OverlayWindow();
ProductSpecification ProductSpecificationBuf01 = new ProductSpecification(StrTitle, product, blnPackaging);
switch (index)
{
case 0:
_overlay.ShowDialog(mainWindow);
await ProductSpecificationBuf01.ShowDialog(mainWindow);
break;
case 1:
_overlay.ShowDialog(payment);
await ProductSpecificationBuf01.ShowDialog(payment);
break;
case 2:
_overlay.ShowDialog(login);
await ProductSpecificationBuf01.ShowDialog(login);
break;
case 3:
_overlay.ShowDialog(loading);
await ProductSpecificationBuf01.ShowDialog(loading);
break;
case 4:
_overlay.ShowDialog(invoiceCarrier);
await ProductSpecificationBuf01.ShowDialog(invoiceCarrier);
break;
case 7:
_overlay.ShowDialog(closingHandover);
await ProductSpecificationBuf01.ShowDialog(closingHandover);
break;
case 8:
_overlay.ShowDialog(expenseList);
await ProductSpecificationBuf01.ShowDialog(expenseList);
break;
case 13:
_overlay.ShowDialog(orderInquiry);
await ProductSpecificationBuf01.ShowDialog(orderInquiry);
break;
case 14:
_overlay.ShowDialog(orderPrint);
await ProductSpecificationBuf01.ShowDialog(orderPrint);
break;
}
_overlay.Close();
}
public static async Task InvoiceCarrier(int index)
{
// 創建並顯示遮罩視窗
OverlayWindow _overlay = new OverlayWindow();
InvoiceCarrier InvoiceCarrier01 = new InvoiceCarrier();
switch (index)
{
case 0:
_overlay.ShowDialog(mainWindow);
await InvoiceCarrier01.ShowDialog(mainWindow);
break;
case 1:
_overlay.ShowDialog(payment);
await InvoiceCarrier01.ShowDialog(payment);
break;
case 2:
_overlay.ShowDialog(login);
await InvoiceCarrier01.ShowDialog(login);
break;
case 3:
_overlay.ShowDialog(loading);
await InvoiceCarrier01.ShowDialog(loading);
break;
case 4:
_overlay.ShowDialog(invoiceCarrier);
await InvoiceCarrier01.ShowDialog(invoiceCarrier);
break;
case 7:
_overlay.ShowDialog(closingHandover);
await InvoiceCarrier01.ShowDialog(closingHandover);
break;
case 8:
_overlay.ShowDialog(expenseList);
await InvoiceCarrier01.ShowDialog(expenseList);
break;
case 13:
_overlay.ShowDialog(orderInquiry);
await InvoiceCarrier01.ShowDialog(orderInquiry);
break;
case 14:
_overlay.ShowDialog(orderPrint);
await InvoiceCarrier01.ShowDialog(orderPrint);
break;
}
_overlay.Close();
}
public static async Task ScanCode(int index, String StrMsg)
{
// 創建並顯示遮罩視窗
OverlayWindow _overlay = new OverlayWindow();
ScanCode ScanCode01 = new ScanCode(StrMsg);
switch (index)
{
case 0:
_overlay.ShowDialog(mainWindow);
await ScanCode01.ShowDialog(mainWindow);
break;
case 1:
_overlay.ShowDialog(payment);
await ScanCode01.ShowDialog(payment);
break;
case 2:
_overlay.ShowDialog(login);
await ScanCode01.ShowDialog(login);
break;
case 3:
_overlay.ShowDialog(loading);
await ScanCode01.ShowDialog(loading);
break;
case 4:
_overlay.ShowDialog(invoiceCarrier);
await ScanCode01.ShowDialog(invoiceCarrier);
break;
case 7:
_overlay.ShowDialog(closingHandover);
await ScanCode01.ShowDialog(closingHandover);
break;
case 8:
_overlay.ShowDialog(expenseList);
await ScanCode01.ShowDialog(expenseList);
break;
case 13:
_overlay.ShowDialog(orderInquiry);
await ScanCode01.ShowDialog(orderInquiry);
break;
case 14:
_overlay.ShowDialog(orderPrint);
await ScanCode01.ShowDialog(orderPrint);
break;
}
_overlay.Close();
}
public static async Task NumericKeypad(int index, string StrMsg,bool blnMode=true)
{
// 創建並顯示遮罩視窗
OverlayWindow _overlay = new OverlayWindow();
NumericKeypad NumericKeypad01 = new NumericKeypad(StrMsg, blnMode);
switch (index)
{
case 0:
_overlay.ShowDialog(mainWindow);
await NumericKeypad01.ShowDialog(mainWindow);
break;
case 1:
_overlay.ShowDialog(payment);
await NumericKeypad01.ShowDialog(payment);
break;
case 2:
_overlay.ShowDialog(login);
await NumericKeypad01.ShowDialog(login);
break;
case 3:
_overlay.ShowDialog(loading);
await NumericKeypad01.ShowDialog(loading);
break;
case 4:
_overlay.ShowDialog(invoiceCarrier);
await NumericKeypad01.ShowDialog(invoiceCarrier);
break;
case 7:
_overlay.ShowDialog(closingHandover);
await NumericKeypad01.ShowDialog(closingHandover);
break;
case 8:
_overlay.ShowDialog(expenseList);
await NumericKeypad01.ShowDialog(expenseList);
break;
case 13:
_overlay.ShowDialog(orderInquiry);
await NumericKeypad01.ShowDialog(orderInquiry);
break;
case 14:
_overlay.ShowDialog(orderPrint);
await NumericKeypad01.ShowDialog(orderPrint);
break;
}
_overlay.Close();
}
public static async Task MessageBox(int index, String StrMsg)
{
// 創建並顯示遮罩視窗
OverlayWindow _overlay = new OverlayWindow();
MessageBox MessageBox01 = new MessageBox(StrMsg);
switch (index)
{
case 0:
_overlay.ShowDialog(mainWindow);
await MessageBox01.ShowDialog(mainWindow);
break;
case 1:
_overlay.ShowDialog(payment);
await MessageBox01.ShowDialog(payment);
break;
case 2:
_overlay.ShowDialog(login);
await MessageBox01.ShowDialog(login);
break;
case 3:
_overlay.ShowDialog(loading);
await MessageBox01.ShowDialog(loading);
break;
case 4:
_overlay.ShowDialog(invoiceCarrier);
await MessageBox01.ShowDialog(invoiceCarrier);
break;
case 7:
_overlay.ShowDialog(closingHandover);
await MessageBox01.ShowDialog(closingHandover);
break;
case 8:
_overlay.ShowDialog(expenseList);
await MessageBox01.ShowDialog(expenseList);
break;
case 13:
_overlay.ShowDialog(orderInquiry);
await MessageBox01.ShowDialog(orderInquiry);
break;
case 14:
_overlay.ShowDialog(orderPrint);
await MessageBox01.ShowDialog(orderPrint);
break;
}
_overlay.Close();
}
public static async Task QuesMessageBox(int index, String StrMsg)
{
// 創建並顯示遮罩視窗
OverlayWindow _overlay = new OverlayWindow();
QuesMessageBox QuesMessageBox01 = new QuesMessageBox(StrMsg);
switch (index)
{
case 0:
_overlay.ShowDialog(mainWindow);
await QuesMessageBox01.ShowDialog(mainWindow);
break;
case 1:
_overlay.ShowDialog(payment);
await QuesMessageBox01.ShowDialog(payment);
break;
case 2:
_overlay.ShowDialog(login);
await QuesMessageBox01.ShowDialog(login);
break;
case 3:
_overlay.ShowDialog(loading);
await QuesMessageBox01.ShowDialog(loading);
break;
case 4:
_overlay.ShowDialog(invoiceCarrier);
await QuesMessageBox01.ShowDialog(invoiceCarrier);
break;
case 7:
_overlay.ShowDialog(closingHandover);
await QuesMessageBox01.ShowDialog(closingHandover);
break;
case 8:
_overlay.ShowDialog(expenseList);
await QuesMessageBox01.ShowDialog(expenseList);
break;
case 13:
_overlay.ShowDialog(orderInquiry);
await QuesMessageBox01.ShowDialog(orderInquiry);
break;
case 14:
_overlay.ShowDialog(orderPrint);
await QuesMessageBox01.ShowDialog(orderPrint);
break;
}
_overlay.Close();
}
public static async Task WaitMessageBox(int index, WaitMessageBox.ThreadFun Fun, String StrMsg)
{
// 創建並顯示遮罩視窗
OverlayWindow _overlay = new OverlayWindow();
WaitMessageBox WaitMessageBox01 = new WaitMessageBox(Fun, StrMsg);
switch (index)
{
case 0:
_overlay.ShowDialog(mainWindow);
await WaitMessageBox01.ShowDialog(mainWindow);
break;
case 1:
_overlay.ShowDialog(payment);
await WaitMessageBox01.ShowDialog(payment);
break;
case 2:
_overlay.ShowDialog(login);
await WaitMessageBox01.ShowDialog(login);
break;
case 3:
_overlay.ShowDialog(loading);
await WaitMessageBox01.ShowDialog(loading);
break;
case 4:
_overlay.ShowDialog(invoiceCarrier);
await WaitMessageBox01.ShowDialog(invoiceCarrier);
break;
case 7:
_overlay.ShowDialog(closingHandover);
await WaitMessageBox01.ShowDialog(closingHandover);
break;
case 8:
_overlay.ShowDialog(expenseList);
await WaitMessageBox01.ShowDialog(expenseList);
break;
case 13:
_overlay.ShowDialog(orderInquiry);
await WaitMessageBox01.ShowDialog(orderInquiry);
break;
case 14:
_overlay.ShowDialog(orderPrint);
await WaitMessageBox01.ShowDialog(orderPrint);
break;
}
_overlay.Close();
}
}
}