gpt4 book ai didi

wpf - 自定义 WPF 命令模式示例

转载 作者:行者123 更新时间:2023-12-03 07:49:54 29 4
gpt4 key购买 nike

我已经完成了一些 WPF 编程,但我从未得到过的一件事是命令模式。每个示例似乎都是内置的,编辑、剪切、粘贴。任何人都有自定义命令的最佳实践示例或建议?

最佳答案

啊哈!一个我可以回答的问题!首先,我应该提到,我个人发现在代码中定义和连接命令比在 XAML 中更容易。它允许我比所有 XAML 方法更灵活地连接命令的处理程序。

您应该弄清楚您想要拥有哪些命令以及它们与什么相关。在我的应用程序中,我目前有一个用于定义重要应用程序命令的类,如下所示:

public static class CommandBank
{
/// Command definition for Closing a window
public static RoutedUICommand CloseWindow { get; private set; }

/// Static private constructor, sets up all application wide commands.
static CommandBank()
{
CloseWindow = new RoutedUICommand();
CloseWindow.InputGestures.Add(new KeyGesture(Key.F4, ModifierKeys.Alt));
// ...
}

现在,因为我想将所有代码放在一起,所以对命令使用仅代码方法可以让我将以下方法放在上面的类中:
/// Closes the window provided as a parameter
public static void CloseWindowExecute(object sender, ExecutedRoutedEventArgs e)
{
((Window)e.Parameter).Close();
}

/// Allows a Command to execute if the CommandParameter is not a null value
public static void CanExecuteIfParameterIsNotNull(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = e.Parameter != null;
e.Handled = true;
}

第二种方法甚至可以与其他命令共享,而无需我在整个地方重复它。

一旦定义了这样的命令,就可以将它们添加到任何 UI 中。在下文中,一旦加载了 Window,我将命令绑定(bind)添加到 Window 和 MenuItem,然后使用循环将输入绑定(bind)添加到 Window 以对所有命令绑定(bind)执行此操作。传递的参数是 Window 它的自身,因此上面的代码知道要尝试关闭哪个 Window。
public partial class SimpleWindow : Window
{
private void WindowLoaded(object sender, RoutedEventArgs e)
{
// ...
this.CommandBindings.Add(
new CommandBinding(
CommandBank.CloseWindow,
CommandBank.CloseWindowExecute,
CommandBank.CanExecuteIfParameterIsNotNull));

foreach (CommandBinding binding in this.CommandBindings)
{
RoutedCommand command = (RoutedCommand)binding.Command;
if (command.InputGestures.Count > 0)
{
foreach (InputGesture gesture in command.InputGestures)
{
var iBind = new InputBinding(command, gesture);
iBind.CommandParameter = this;
this.InputBindings.Add(iBind);
}
}
}

// menuItemExit is defined in XAML
menuItemExit.Command = CommandBank.CloseWindow;
menuItemExit.CommandParameter = this;
// ...
}

// ....
}

然后,我稍后也有 WindowClosing 和 WindowClosed 事件的事件处理程序,我建议您使命令的实际实现尽可能小和通用。在这种情况下,如果有未保存的数据,我没有尝试放置试图停止 Window 关闭的代码,而是将该代码牢牢地保存在 WindowClosing 事件中。

如果您有任何后续问题,请告诉我。 :)

关于wpf - 自定义 WPF 命令模式示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452/

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