【问题标题】:Trigger event programmatically and pass value to second page?以编程方式触发事件并将值传递到第二页?
【发布时间】:2019-10-24 10:29:49
【问题描述】:

我想将一个值从 Mainpage 传递到 Page2。当我单击Button_Click 时,变量“t”被传递给 Page2。

但是我需要从代码中触发Button_Click 事件,但随后会引发“NullReferenceException”。

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        Button_Click(new object(), new RoutedEventArgs());
    }

    public void Button_Click(object sender, RoutedEventArgs e)
    {
        string t = "Test";
        navigate_page2(t);
    }

    public void navigate_page2(string t)
    {
        this.Frame.Navigate(typeof(Page2), t);
    }
}

Button_Click(new object(), new RoutedEventArgs()); 触发 Button_Click 事件来做事,除非调用“navigate_page2”。

直接点击和从代码中触发按钮有什么区别?我猜这是“新的 RoutedEventArgs”,但我不知道如何处理...谢谢您的回复!

【问题讨论】:

  • Button_Click(new object(), new RoutedEventArgs()); 替换为Button_Click(sender, e); 将触发事件而不会获得NullReferenceException - 如果您遇到更多困难,请分享更多信息:)
  • 我的第一条评论不是更容易吗...?您提供的链接似乎使用了所有这些复杂的代码,尽管它可能要容易得多:) 不过我喜欢这篇文章!
  • 另外,删除不必要的代码this.InitializeComponent();,然后执行InitializeComponent(); - 它占用空间,而且不需要:)
  • @Momoro。当我像您所说的那样简单地替换时, sender 和 e “在当前上下文中不存在”。似乎它与 Button_Click 的参数不匹配 - 事件...

标签: c# uwp routed-events


【解决方案1】:

请不要直接调用Button_Click,此方法与XAML 中的事件相关联。

如果你想复用Button_Click事件中的代码,可以打包成一个方法来调用。

更新

但随后会抛出“NullReferenceException”。

问题出在this.Frame。对于您的当前页面,this.Frame 不存在。您需要在 xaml 中创建一个子框架。

<Grid>
    <Frame x:Name="MainFrame"/>
</Grid>
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        btn_handle();
    }

    public void Button_Click(object sender, RoutedEventArgs e)
    {
        btn_handle();
    }

    public void btn_handle()
    {
        string t = "Test";
        navigate_page2(t);
    }

    public void navigate_page2(string t)
    {
        MainFrame.Navigate(typeof(Page2), t);
    }
}

最好的问候。

【讨论】:

  • 张。不幸的是,我也得到了 NullReferenceException。我需要一个特殊的 using 指令吗?而且,这是 UWP - 标记它,但没有明确提及它......
  • 您好,我的答案已修正,请检查。
  • 张。这样可行!虽然我还不明白为什么会这样。我认为我的 MainPage.xaml 是从我转到 Page2.xaml 的地方。甚至更多我不明白为什么单击按钮不需要这个额外的 MainFrame ......不过,你的解决方案解决了我的问题,最终我会在 C# 的进展中理解。非常感谢您的帮助,Richard Zhang!
  • 在 UWP 中,Page 总是需要 Frame 来渲染,就像你总是在浏览器窗口中打开网页一样。如果要导航到Page2,则需要一个Frame来渲染它,可惜this.Frame在当前条件下不存在,可以使用var frame = Window.Current.Content as Frame; 获取当前窗口的RootFrame , 也是有效的。
【解决方案2】:

据我所知,您正试图将值从一个页面传递到另一个页面,让我们以两个表单为例,您需要通过任何按钮的点击将一个值从一个表单传递到另一个表单。

Form2

public partial class Form2 : Form
{
    public event EventHandler TextEvent;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Hide();
        if (TextEvent != null)
        {
            TextEvent(label1.Text, null);
        }
    }
}

表格1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 obj = new Form2();
        obj.Show();
        obj.TextEvent += obj_TextEvent;
    }

    void obj_TextEvent(object sender, EventArgs e)
    {
        label1.Text = sender.ToString();
    }
}

我在这里所做的是我在 Form2 中创建了一个事件,该事件在单击 Form2 的 Button1 时触发,并且数据作为发送者传递给 Form1,其中 Form2 obj 已启动事件并将 Form1 的 label1 设置为 label1.Text =发件人.ToString();

【讨论】:

  • 问题是关于 UWP,而不是 WinForms
  • 好吧,如果你要为触发器创建一个事件,它的工作原理是一样的,基本上它是一个理解或参考的例子。
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
相关资源
最近更新 更多