Silverlight2下本身没有模态窗体的实现,虽然本身有Messagebox.Show但是对于复杂的应用来说是很难满足需求的。这个时候
我们就需要自己来实现模态窗体这样的效果。实际上实现的原理是很简单的,我们的主界面在一个Grid容器里,而模态窗体在一个Grid容器里,这个时候逻
辑实际上就变成了Grid里一个按钮被单击后,以及模态窗体的关闭按钮被单击后,它们哪一个层在上面哪一个在下面的问题了,这里我们需要用到一个属性:
Canvas.ZIndex
数字越大就越排在上面。
各层的排列如下图:
gdParent为父容器层。
gdBody为主界面曾。
gdMessage为模态窗体层。
<Grid Height="300" x:Name="gdParent" Width="400">
<Grid x:Name="gdBody" Canvas.ZIndex="1" d:IsHidden="True">
<Rectangle Fill="#FFFFFFFF" Stroke="#FF000000"/>
<Button Height="32" Width="96" Content="单击" x:Name="btnTest"
HorizontalAlignment="Left" Margin="24,16,0,0"
VerticalAlignment="Top"/>
</Grid>
<Grid x:Name="gdMessage" Opacity="1" Canvas.ZIndex="0">
<Rectangle Stroke="#FF000000" Opacity="0.2" Fill="#FFC8D4E6"/>
<Rectangle Stroke="#FF000000" Margin="72,40,88,66" Fill="#FFFFFFFF"/>
<TextBlock Text="我是一个模态窗体" TextWrapping="Wrap" FontSize="20" Margin="90,103,106.359,125"/>
<Button Height="25" Width="48" Content="关闭"
x:Name="btnClose" HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="0,32,96,0"/>
</Grid>
</Grid>
gdBody层在Blend里预览如下所示:
画这个层的时候需要注意的是,即使没有背景颜色,最好也给背景色指定成白色,这样当主界面显示的时候,下面的模态窗体层才不会显示出来。
gdMessage层在Blend里预览如下所示:
这个层需要注意的是,我们为了不让模态窗体出现的时候主界面的按钮被单击到(但是还要被看到,类似vista下的UAC),需要一个东西来做遮罩。
我考虑过在Grid上直接加,但问题是,它需要有一个透明度,这样一来里面所有的元素都会具有这个不透明度属性。所以这里我是单独添加的一个
Rectangle,用它来做遮罩,从而避免了这个问题。
另,即使这个遮罩不想使用任何颜色,那么也要给它强制指定一个背景颜色,然后把其透明度设置成0,因为假
如在WPF下画一个矩形,只给它指定了边框颜色而没有填充颜色的话,那么鼠标能触发的区域实际上只是一个边框,只有有背景色后,哪怕其是完全透明的,那么
这个矩形里面的区域才可以被鼠标触发.
以下是后台代码的实现:
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
btnClose.Click += new RoutedEventHandler(btnClose_Click);
btnTest.Click += new RoutedEventHandler(btnTest_Click);
}
void btnTest_Click(object sender, RoutedEventArgs e)
{
gdBody.SetValue(Canvas.ZIndexProperty, 0);
gdMessage.SetValue(Canvas.ZIndexProperty,1);
}
void btnClose_Click(object sender, RoutedEventArgs e)
{
gdBody.SetValue(Canvas.ZIndexProperty, 1);
gdMessage.SetValue(Canvas.ZIndexProperty, 0);
}
}
以下是运行效果图:
刚开始运行的时候只有一个Button,点击之后,出现如上界面。这个时候刚才的那个按钮是无法背点击的。
本文示例代码在这里下载
---------------------------------------------------------------
此文出自博客园的aspnetx,如有疑问或需要帮助请直接访问作者博客,有问必答.在其它转载社区的留言或交互请恕作者无法答复.
分享到:
相关推荐
C# 非模态窗体(show)实现模态窗体(ShowDialog)的效果
C# 非模态窗体(show)实现模态窗体(ShowDialog)的效果 .rar
模态窗体的多种打开方式,及关闭时的各种对话框,适宜开发网页增加客户友好性
本试例可以结合asp.net ajsx 来实现模态局布刷新
利用offset实现模态框拖动。
jquery 弹出模态窗体
Hyperview二次开发:模态阵型的自动排列、输出GIF、输出PPT等
c#中如何控制模态子窗体中的进度条 这个问题会让一些初学者感到困惑,一方面模态窗体在打开之后(Form.ShowDialog).主线程无法继续执行下面的事务;另一方面,又要在处理事务的时候来同步这个窗体里面的进度条。这...
第17周-第07章节-Python3.5-示例:模态编程框(一).avi
第17周-第08章节-Python3.5-示例:模态编程框(二).avi
第17周-第10章节-Python3.5-示例:模态编程框(三).avi
第17周-第13章节-Python3.5-示例:模态编程框(四).avi
Delphi 模态窗体下更新另一个窗体内容,更方便多选内容在新窗体更新
JS弹出模态窗体,WIND.one p opne
利用模态对话框实现父窗体、子窗体间传值。 服务器showModalDialog 打开子窗体,子窗体使用客户端脚本和服务器端方法向父窗体传值
winform 中 打开的窗体分两种:模态与非模态 模态窗体,例如对话框,如果不关闭,那么其父窗体是无法操作的, 但是就winform来说 看不出哪个是当前活动窗体; 为了让他两者有区分,我们选择遮住模态窗体的父窗体盖上...
自己制作的DIV模态窗口,点击弹出DIV窗口,后层页面屏蔽,实现模态窗口。需要用vs2010打开
artDialog是一个精巧的web对话框组件,压缩后只有十多KB,并且不依赖其他框架
JQuery实现可移动模态窗口 JQuery实现可移动模态窗口 JQuery实现可移动模态窗口
自己做的一个开源小控件,主要用于Silverlight的MDI应用开发。