在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,000 Things You Should Know About WPF 。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。很希望能够分享给大家。
本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。
在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。
前文可以翻阅本博客wpf标签的文章。查看往期
[小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂。cnblogs.com/xfuture]
#78 Modal Dialog 和 Modeless Window
Modal Dialog(模式窗口)是出现在该程序其他窗口之前的窗口,会阻止与其他窗口所以的互动,直至其关闭。最小化Modal Window也会最小化其余所有窗口。
Modeless Window 即正常窗体,不会阻碍和其余窗口的互动,互不干涉。
在实际应用中根据不同业务情况选择不同的窗口类型。
下面例子中使用Window.Show和Window.ShowDialog方法来分别展示非模式窗口和模式窗口。
private void btnModal_Click(object sender, RoutedEventArgs e)
{
ChildWindow win = new ChildWindow();
win.Title = "Modal child - " + DateTime.Now.ToLongTimeString();
win.ShowDialog();
} private void btnModeless_Click(object sender, RoutedEventArgs e)
{
ChildWindow win = new ChildWindow();
win.Title = "Modeless window - " + DateTime.Now.ToLongTimeString();
win.Show();
}
#79 Modal Dialog 和 Modeless Window举例(使用Windows自带Notepad)
运行Windows自带的记事本就可以看到Modal Dialog和Modeless Dialog两种窗体形式。
开启记事本后,输入一些文字,点击查找Edit|Find(Ctrl+F)。可以发现可以随意切换主窗体和搜索窗口的。所以Find Dialog是一个modeless dialog,你仍可以与主窗体进行交互。
然后关闭Find窗口,点击File|Print(Ctrl+p)打开打印窗体。当打印窗体存在的时候,你可以发现你并不能切换到主窗体了。打印窗体就是一个模式窗口(Modal Dialog)。
#80 Window Size and Location
Window类拥有Left和Top属性来定位其在显示器中的位置。同时拥有Width和Height来指定窗口大小。赋值时使用的都是设备无关的单位(device independent units).
假设你屏幕的DPI设置为96Dpi(dots per inch),WpF使用的单位是设备无关单位. 当你设定为96个单位的时候就是1 inch高.如果是其他Dpi,则遵循之下换算公式:
# pixels = (# WPF Units) * (DPI / 96)
这样Wpf程序显示在相同尺寸显示器中是相同的,无论是什么像素的密度。
#81 WPF Units
在Windows Form, 控件大小是以pixel来控制的。在WPF中,是以Wpf Units来控制的,设备无关。
1 WPF unit = 1/96 inch. 也就是说在96DPI显示器上, 1 WPF Unit = 1 pixel.
也就是说在120DPI的环境,1 WPF unit = 1.25 pixels. (120/96)。
在Windows Form中也可以实现类似的设备无关性,通过修改Form的AutoScaleMode属性,在WPF中,是自动的。
公式:# pixels = (# WPF Units) * (DPI / 96)
下一期会有更多关于WPF GUI和Application 周期,希望能多多关注~