以编程方式单击Xamarin.Forms中的按钮

时间:2016-12-15 05:54:13

标签: c# xamarin.forms

我在xamarin表单上有2个按钮,

scannerButton和checkOrderButton

scannerButton打开扫描仪页面,扫描QRCode并将其填充到订单输入字段

checkOrderButton读取订单输入字段中的任何内容并处理验证并将其发送到服务器进行验证

我想要的是 - 在扫描文本后调用scannerButton.Click中的checkOrderButton.Click -

代码:

private async void scanCameraButton_Clicked(object sender, EventArgs e)
{
    var options = new ZXing.Mobile.MobileBarcodeScanningOptions();
    options.PossibleFormats = new List<ZXing.BarcodeFormat>() {
        ZXing.BarcodeFormat.QR_CODE,ZXing.BarcodeFormat.EAN_8, ZXing.BarcodeFormat.EAN_13
    };

    var scanPage = new ZXingScannerPage(options);
    scanPage.OnScanResult += (result) =>
    {
        //stop scan
        scanPage.IsScanning = false;

        Device.BeginInvokeOnMainThread(() =>
        {
            //pop the page and get the result
            Navigation.PopAsync();
            orderNoEntry.Text = result.Text;
        });

            //invoke checkOrderButton.Click here

    };

这样做的最佳方法是什么?

一个替代方法是将checkOrderButton.Click处理程序中的所有功能转储到一个函数中,然后从两个按钮单击调用该函数,但我有兴趣学习如何以编程方式调用click事件

4 个答案:

答案 0 :(得分:2)

实际上你应该传递两个参数,所以它不应该只是Button_Click(),你应该像这样调用它:Button_Click(null, null)因为它需要sender和e作为两个必需参数,看看方法定义:Button_Click(对象发送者,EventArgs e){..}

答案 1 :(得分:1)

正如萨米已经提到过的,我建议将checkOrderButton.Click的功能提取到一个单独的方法,这样你就可以从checkOrderButton.ClickscannerButton.Click中调用一些方法。< / p>

答案 2 :(得分:1)

我要做的是拥有一个带有命令的viewmodel,该命令可以执行按下按钮时所执行的任何逻辑操作。

然后将按钮的Command属性绑定到ViewModel中的command属性。

在这个阶段,您将拥有一个可以以编程方式执行的命令,就像您调用了&#34; Button.Click()&#34;如果有这样的事情。

答案 3 :(得分:0)

我为此目的编写了一个扩展方法。这不仅适用于Xamarin-Forms-projects项目,而且还适用于WPF项目。

using System;
using System.Reflection;
using System.Windows;
using System.Windows.Input;
#if !NETSTANDARD
using System.Windows.Controls;
#else
using Xamarin.Forms;
#endif

public static class ButtonExtensions
{
    public static void PerformClick(this Button sourceButton)
    {
        // Check parameters
        if (sourceButton == null)
            throw new ArgumentNullException(nameof(sourceButton));

        // 1.) Raise the Click-event
#if !NETSTANDARD
        sourceButton.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ButtonBase.ClickEvent));
#else
        sourceButton.RaiseEventViaReflection(nameof(sourceButton.Clicked), EventArgs.Empty);
#endif

        // 2.) Execute the command, if bound and can be executed
        ICommand boundCommand = sourceButton.Command;
        if (boundCommand != null)
        {
            object parameter = sourceButton.CommandParameter;
            if (boundCommand.CanExecute(parameter) == true)
                boundCommand.Execute(parameter);
        }
    }

#if NETSTD
    private static void RaiseEventViaReflection<TEventArgs>(this object source, string eventName, TEventArgs eventArgs) where TEventArgs : EventArgs
    {
        var eventDelegate = (MulticastDelegate)source.GetType().GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(source);
        if (eventDelegate == null)
            return;
        foreach (var handler in eventDelegate.GetInvocationList())
        {
#if !(NETSTANDARD1_6 || NETSTANDARD1_5 || NETSTANDARD1_4 || NETSTANDARD1_3 || NETSTANDARD1_2 || NETSTANDARD1_1 || NETSTANDARD1_0)
            handler.Method?.Invoke(handler.Target, new object[] { source, eventArgs });
#else
            handler.GetMethodInfo()?.Invoke(handler.Target, new object[] { source, eventArgs });
#endif
        }
    }
#endif
}