在 WPF 中关闭窗口而不使用代码隐藏
本文关键字:代码 隐藏 窗口 WPF | 更新日期: 2023-09-27 17:56:25
是否可以在不添加代码隐藏事件的情况下将Button
绑定到关闭Window
?
<Button Content="OK" Command="{Binding CloseWithSomeKindOfTrick}" />
而不是以下 XAML:
<Button Content="OK" Margin="0,8,0,0" Click="Button_Click">
使用代码隐藏:
private void Button_Click(object sender, RoutedEventArgs e)
{
Close();
}
谢谢!
如果要关闭对话框Window
,可以添加 按钮IsCancel
属性:
<Button Name="CloseButton"
IsCancel="True" ... />
这意味着以下MSDN
:
将按钮的
IsCancel
属性设置为 true 时,将创建一个向访问密钥管理器注册的按钮。然后,当用户按 ESC 键时,该按钮将被激活。
现在,如果您单击此按钮,或按 Esc 然后对话框Window
正在关闭,但它不适用于正常MainWindow
。
要关闭MainWindow
,您可以简单地添加一个已经显示的 Click 处理程序。但是,如果您想要一个满足 MVVM 样式的更优雅的解决方案,您可以添加附加的行为:
public static class ButtonBehavior
{
#region Private Section
private static Window MainWindow = Application.Current.MainWindow;
#endregion
#region IsCloseProperty
public static readonly DependencyProperty IsCloseProperty;
public static void SetIsClose(DependencyObject DepObject, bool value)
{
DepObject.SetValue(IsCloseProperty, value);
}
public static bool GetIsClose(DependencyObject DepObject)
{
return (bool)DepObject.GetValue(IsCloseProperty);
}
static ButtonBehavior()
{
IsCloseProperty = DependencyProperty.RegisterAttached("IsClose",
typeof(bool),
typeof(ButtonBehavior),
new UIPropertyMetadata(false, IsCloseTurn));
}
#endregion
private static void IsCloseTurn(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue is bool && ((bool)e.NewValue) == true)
{
if (MainWindow != null)
MainWindow.PreviewKeyDown += new KeyEventHandler(MainWindow_PreviewKeyDown);
var button = sender as Button;
if (button != null)
button.Click += new RoutedEventHandler(button_Click);
}
}
private static void button_Click(object sender, RoutedEventArgs e)
{
MainWindow.Close();
}
private static void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
MainWindow.Close();
}
}
在MainWindow
中,请使用此行为,如下所示:
<Window x:Class="MyProjectNamespace.MainWindow"
xmlns:local="clr-namespace:MyProjectNamespace">
<Button Name="CloseButton"
local:ButtonBehavior.IsClose="True" ... />