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;
}
}
}
浙公网安备 33010602011771号