首页 > 解决方案 > 如何从 MainWindow 调用 XAML 中的方法?

问题描述

我正在尝试从 MainWindow.xaml.cs 调用 MainWindow.xaml 中的方法。我在任何地方都找不到这将如何工作。

例如,假设我的 xaml 代码中有 KeyBinding,并且我希望在按下 CTRL+E 时MethodIWantToCall被调用。

<Page x:Class="Example"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Example"
      mc:Ignorable="d">
<Page.InputBindings>
        <KeyBinding Command="{Binding MethodIWantToCall}" Gesture="Ctrl+E"/>
</Page.InputBindings>
</Page>
public partial class Example : Page
{
    public Example()
    {
        InitializeComponent();
    }

    public void MethodIWantToCall()
    {
        //Body
    }
}

当然,当我运行代码并按 Ctrl+E 时,什么都不会发生。如果我将方法放在其他类中它会起作用,但在我的情况下,我需要它是 xaml 后面的这个页面。

标签: c#wpfxaml

解决方案


命令不仅仅是方法,它们实际上是类。具体来说,它们是实现该ICommand接口的任何类的实例。“命令”类有一个Execute方法,它实际上执行操作,以及一个可选CanExecute的,用于确定命令当前是否能够执行。

这是关于命令的 WPF 文档:Commanding Overview

这主要关注RelayCommand哪个是 WPF 实现的命令,其功能类似于RoutedEvents。另一种方法是使用“RelayCommand”(又名“DelegateCommand”)。RelayCommand 实际上不是任何标准 .NET 库的一部分,但它是一个简单、常用的类。你可以在这个答案中找到它的暗示。

这是一个讨论何时/为什么可以使用RoutedCommandoverRelayCommand或反之亦然的问题:WPF ICommand vs RoutedCommand。我个人在不同的时间都使用过。

总结一下:您需要定义一个自定义命令,在Example该命令中执行时将调用MethodIWantToCall. 根据您选择使用RelayCommand还是RoutedCommand.


推荐阅读