Windows and Dialogs 窗口和对话框
无边框,无外壳,且不能改变大小的窗口:
WindowStyle="None" ResizeMode="NoResize"
窗口生命周期:
Activated
当窗口被激活(例如,单击)时引发。如果窗口从未被激活,您将不会获得此事件(或相应的
Deactivated事件)。
Closing
当窗口试图自行关闭时引发。您可以通过将CancelEventArgs参数的Cancel属性设置为 true
来取消它。
窗口位置和大小
您可以使用Top和Left属性管理窗口的x和y位置,而您可以使用TopMost属性影响 Z 顺序。在整个
桌面上,所有TopMost属性设置为 true 的窗口都显示在所有TopMost属性设置为 false 的窗口之
上,尽管窗口在其层中的 Z 顺序由用户交互决定。例如,单击一个非最顶层窗口会将其带到非最顶层
窗口的顶部,但不会将其带到任何最顶层窗口的前面。
如果您想手动设置窗口的启动位置,可以通过在显示窗口之前设置Top和Left属性来实现。但是,如
果您只想让窗口在屏幕或所有者上居中,则可以在显示窗口之前根据需要将WindowStartupLocation属性设置为CenterScreen或CenterOwner :
Window1 window = new Window1( ); window.WindowStartupLocation = WindowStartupLocation.CenterScreen; window.Show( ); // wil
如果您不更改WindowStartupLocation,则默认为手动。 Manual允许您通过设置Top和Left来确定初始位置
您可以在Initialized事件之后(而不是期间)从Window类的ActualWidth和ActualHeight属性关系中获取窗口的大小(例如, Loaded是获取它们的好地方)
如果您不想手动调整窗口大小,而是希望窗口的大小最初由内容的大小控制,您可以将SizeToContent属性从默认的SizeToContent枚举值Manual更改为其他三个值之一枚举值:
Width、 Height或WidthAndHeight。如果内容大小超出一个或两个维度的最小/最大界限,则最小/最大界限仍将得到遵守。同样,如果Width或Height是手动设置的,则SizeToContent设置将被忽略。
SizeToContent="Width" //窗口宽根据内容自动生成
默认情况下,所有窗口都是可调整大小的;但是,您可以通过使用ResizeMode枚举中的值之一设置ResizeMode属性来更改行为: NoResize、 CanMinimize、 CanResize或CanResizeWithGrip,
Window Owners 窗口所有者
在实践中,自有窗口的主要视觉用途是创建浮动工具窗口或无模式对话框(即,具
有与自有窗口共享的最小化和恢复行为的东西)。
Window Visibility and State 窗口可见性和状态
Visibility属性控制窗口的可见性,该属性具有来自Visibility枚举的以下值: Visible、 Hidden和Collapsed。 ( Window类将Hidden和Collapsed视为相同。)您还可以
使用Show和Hide方法。除了停止呈现窗口外, Hide方法还将其从任务栏中取出(假设首先设置了ShowInTaskbar属性)。
如果您想隐藏窗口但将其留在任务栏中,您可以将WindowState属性设置为WindowState枚举值Minimized。要恢复它或使其占据整个桌面(减去任务栏和边栏),您可以使用正常或最大化。
RestoreBounds仅在窗口处于Normal状态时移动或调整大小时才会更改。这使得RestoreBounds成为一个方便的属性,可以保留在用户设置中以恢复窗口
保存和恢复窗口状态:
public partial class MainWindow : System.Windows.Window { public MainWindow( ) { InitializeComponent( ); try { // Restore state from user settings Rect restoreBounds = Properties.Settings.Default.MainRestoreBounds; WindowState = WindowState.Normal; Left = restoreBounds.Left; Top = restoreBounds.Top; Width = restoreBounds.Width; Height = restoreBounds.Height; WindowState = Properties.Settings.Default.MainWindowState; } catch { } // Watch for main window to close Closing += window_Closing; }
// Save state as window closes void window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { Properties.Settings.Default.MainRestoreBounds = RestoreBounds; Properties.Settings.Default.MainWindowState = WindowState; Properties.Settings.Default.Save(); }
Dialogs 对话框
Common Dialogs 通用对话框
WPF 有三个通用对话框 :OpenFileDialog, SaveFileDialog, PrintDialog
注意: 与 Windows 窗体提供的常见对话框不同,WPF ShowDialog返回一个可为 null 的布尔值,而不是枚举值。
private void openFileDialog_Click(object sender, RoutedEventArgs e) {//文件对话框 OpenFileDialog dlg= new OpenFileDialog(); dlg.FileName=filename; if(dlg.ShowDialog()==true) { filename=dlg.FileName; } } private void folderBrowserDialog_Click(object sender, RoutedEventArgs e) {//文件夹对话框 System.Windows.Forms.FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog(); dlg.SelectedPath = folder; if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { folder = dlg.SelectedPath; // do something with the fold } }
可用的通用对话框
下面是 WPF 和 Windows 组合提供的常见对话框列表:
它们中的大多数都按照您期望的方式工作,因为它们处理的类型可以在 Windows Forms 或 WPF 中轻松使用(例如,包含文件夹名称或文件名的字符串在两者中都同样有效)。另一方面,它们中的
三个(ColorDialog、 FontDialog和PrintPreviewDialog)在 WPF 中根本不能很好地工作。
Custom Dialogs 自定义对话框
关于构建模式对话框,我们所做的唯一一件事就是设置
<Window ... WindowStartupLocation="CenterOwner">
对话框需要具备一些基本的功能如下:
- 初始焦点设置在正确的元素上。
FocusManager.FocusedElement="{Binding ElementName=reportFolderTextBox}"
- 对话框不显示在任务栏中。
ShowInTaskbar="False"
- 数据传入和传出对话框。
- OK 按钮显示为默认按钮(并在按 Enter键被按下)。
- 当按下Esc 键时取消被激活。
- 在点击“OK”按钮时验证输入的数据。
public class RegexValidation : ValidationRule {//正则表达式验证 public override ValidationResult Validate(object value, CultureInfo cultureInfo) { Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"); Match match = regex.Match(value.ToString()); if (match == null || match == Match.Empty) { return new ValidationResult(false, "Please enter valid email"); } else { return ValidationResult.ValidResult; } } }