以 ShowDialog() 顯示的模態視窗,若設 Visibility = Hidden 隱藏,再設 Visibility = Visible 顯示,視窗將失去模態特性(主視窗恢復可互動)。
WPF 內部以 Visibility 控制模態狀態,隱藏會破壞模態循環。
保留視窗實例與模態狀態,將視窗座標移至螢幕外(如 -100000, -100000),並關閉工作列圖示;還原時恢復座標、狀態與工作列顯示。
public static class WindowVisibilityHelper
{
public static readonly DependencyProperty IsVisibleProperty =
DependencyProperty.RegisterAttached("IsVisible", typeof(bool), typeof(WindowVisibilityHelper),
new PropertyMetadata(true, OnIsVisibleChanged));
private static void OnIsVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var win = (Window)d;
bool visible = (bool)e.NewValue;
if (!visible)
{
SaveWindowState(win);
win.WindowState = WindowState.Normal;
win.Left = -100000;
win.Top = -100000;
win.ShowInTaskbar = false;
}
else
{
RestoreWindowState(win);
win.Activate();
win.BringIntoView();
}
}
// 儲存/還原 Left、Top、WindowState、ShowInTaskbar 至附加屬性...
}
<Window local:WindowVisibilityHelper.IsVisible="{Binding IsWindowVisible}" />
綁定 ViewModel 布林屬性即可安全切換「可見/不可見」且保持模態行為,適合螢幕鎖定、閒置隱藏等場景。