WPF 的 Window 样式控件模板如何实现关闭后弹窗提示
WPF 使用中,通过自定义 Window 样式绑定,实现统一的界面风格,像自定义无边框窗体。如果有这样的场景,用户点击窗体上的x
试图关闭窗体,在某种情况下,如数据未保存,想要弹一个 MessageBox 来提示用户是否确定关闭。这样如何实现呢?
下面是我想的一种实现方式,在窗体 XMAL 代码中定义一个 bool 静态资源,关闭时间的后台代码通过判断它来执行,同时窗体的 behindCode 也可以更改它 :
Style 样式中的 ControlTemplate 的一个 x
关闭按钮用来关闭窗体:
<Button Height="20" Width="20" Content="{StaticResource WindowCloseSymbol}" HorizontalContentAlignment="Center" Margin="2 0 0 0"
Style="{StaticResource ResourceKey=CustomWindowMenuBtn}" Click="CustomWindowBtnClose_Click" />
Window 的这个 Style 样式关闭按钮 Click
绑定了后台事件代码:
// 关闭
private void CustomWindowBtnClose_Click(object sender, RoutedEventArgs e)
{
Window win = (Window)((FrameworkElement)sender).TemplatedParent;
if (win.TryFindResource("CanClose") == null)
{
win.Close();
return;
}
if (!(bool)win.FindResource("CanClose"))
{
string msg = (string)win.TryFindResource("Message");
if (msg == null)
{
return;
}
if (HMessageBoxLib.HMessageBox.Show(msg, "提示", HMessageBoxLib.HMessageBoxButtons.YesNo) != HMessageBoxLib.HMessageboxResult.Yes)
{
return;
}
win.Close();
if (win.Owner != null)
win.Owner.Activate();
return;
}
win.Close();
if (win.Owner != null)
win.Owner.Activate();
}
窗体的 XMAL 静态资源:
<Window.Resources>
<sys:Boolean x:Key="CanClose" >True</sys:Boolean>
<sys:String x:Key="Message" >未保存,是否确定退出?</sys:String>
</Window.Resources>
效果是这样的:
点击右上的 x
关闭,会有弹窗:
在知道资源位置的情况下,窗体后台代码可以直接通过键索引的这样的方式更改资源的值,这样可以在关闭窗口之前,更改 Resources["CanClose"]
根据情况是否要弹窗判断(ViewModel 可以通过 Messenger 的方式来更改 View 中的资源。):
Resources["CanClose"] = true;
Resources["Message"] = "确定关闭吗?";
这的CanClose
为true
时,可以直接关闭窗口,不需要弹窗提醒;相反为false
时则不能直接关闭窗体,需要弹窗提醒。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了