gpt4 book ai didi

WPF DialogResult 声明性地?

转载 作者:行者123 更新时间:2023-12-04 12:43:57 27 4
gpt4 key购买 nike

在 WinForms 中,我们可以为按钮指定 DialogResult。在 WPF 中,我们只能在 XAML 中声明取消按钮:

<Button Content="Cancel" IsCancel="True" />

对于其他人,我们需要捕获 ButtonClick 并编写如下代码:
private void Button_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}

我正在使用 MVVM,所以我只有 Windows 的 XAML 代码。但是对于模态窗口,我需要编写这样的代码,我不喜欢这样。在 WPF 中是否有更优雅的方式来做这些事情?

最佳答案

您可以使用 attached behavior 执行此操作保持你的 MVVM 干净。附加行为的 C# 代码可能如下所示:

public static class DialogBehaviors
{
private static void OnClick(object sender, RoutedEventArgs e)
{
var button = (Button)sender;

var parent = VisualTreeHelper.GetParent(button);
while (parent != null && !(parent is Window))
{
parent = VisualTreeHelper.GetParent(parent);
}

if (parent != null)
{
((Window)parent).DialogResult = true;
}
}

private static void IsAcceptChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var button = (Button)obj;
var enabled = (bool)e.NewValue;

if (button != null)
{
if (enabled)
{
button.Click += OnClick;
}
else
{
button.Click -= OnClick;
}
}
}

public static readonly DependencyProperty IsAcceptProperty =
DependencyProperty.RegisterAttached(
name: "IsAccept",
propertyType: typeof(bool),
ownerType: typeof(Button),
defaultMetadata: new UIPropertyMetadata(
defaultValue: false,
propertyChangedCallback: IsAcceptChanged));

public static bool GetIsAccept(DependencyObject obj)
{
return (bool)obj.GetValue(IsAcceptProperty);
}

public static void SetIsAccept(DependencyObject obj, bool value)
{
obj.SetValue(IsAcceptProperty, value);
}
}

您可以通过以下代码在 XAML 中使用该属性:
<Button local:IsAccept="True">OK</Button>

关于WPF DialogResult 声明性地?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2543014/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com