gpt4 book ai didi

WPF 使用自定义 RoutedUICommands 还是简单的事件处理程序?

转载 作者:行者123 更新时间:2023-12-04 17:06:09 24 4
gpt4 key购买 nike

我今天与某人谈论如何选择一种设计模式来处理他们的 WPF 程序中的逻辑,并希望 SO 社区可以提供进一步的建议以使决策更容易。 哪些因素有利于命令胜过不便?

我准备了一个完整的sample连同一些 UML diagrams三种方法中的前两种:

  • 在按钮和菜单上使用 Click 事件处理程序。
  • 使用 XAML 中绑定(bind)的命令。
  • 使用代码中绑定(bind)的命令,并为纯 GUI 布局和样式保留 XAML。

  • 他参加的入门类(class)和许多书籍都将简单的 Click 事件处理程序作为将逻辑连接到 UI 对象的自然方式。

    他对使用命令所需的开销量感到有些震惊,因为命令是在代码隐藏文件中创建的:
    public static readonly ICommand cmdShow2 = new RoutedUICommand(
    "Show Window2", "cmdShow2",
    typeof(TestDespatchWindow));

    然后是 XAML 中的更多代码,必须以冗长的方式识别和绑定(bind)命令:
    <Window x:Class="WPFDispatchDemo.TestDespatchWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:w="clr-namespace:WPFDispatchDemo"..>

    <Window.CommandBindings>
    <CommandBinding Command="{x:Static w:TestDespatchWindow.cmdShow2}"
    Executed="OnShow2" />
    </Window.CommandBindings>
    <DockPanel>
    <StackPanel Margin="0,8,0,0">
    <Button x:Name="Show2EventBased"
    Margin="10,2,10,2"
    Click="OnShow2"
    Content="Show2 via WPF Event"/>
    <Button x:Name="Show2Command"
    Command="{x:Static w:TestDespatchWindow.cmdShow2}"
    Margin="10,2,10,2"
    Content="Show2 via WPF"/>
    </StackPanel>
    </DockPanel>
    </Window>

    我(还)不能声称自己是 WPF 专家,所以我可能把事情画得比实际更复杂,但我怀疑你不能比上面更简单地简化事情。

    编辑:

    我发现了一个有趣的 3-way comparison在 DelegateCommand、RoutedCommand 和 Event 之间。

    最佳答案

    指挥他们的优缺点,你要根据自己的情况来选择,
    我强烈建议您根据具体情况做出选择,不要为整个项目选择“一种真正的方式”。

    在某些情况下,发送方和接收方之间的分离以及仅使用 XAML 发送命令的能力是一个很大的优势(作为一个很好的示例,请查看 ScrollBar 控件模板如何与 http://msdn.microsoft.com/en-us/library/ms742173.aspx 处的控制逻辑进行通信)。

    在其他情况下,命令可以将原本是 2 行的事件处理程序变成一些不可能遵循的怪物,涉及更改应用程序中的 4 个不同位置 (How should the ViewModel close the form?)。

    关于WPF 使用自定义 RoutedUICommands 还是简单的事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/558311/

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