将自定义事件表单从一页发送到另一页

Posted

技术标签:

【中文标题】将自定义事件表单从一页发送到另一页【英文标题】:Sending custom event form one page to another 【发布时间】:2021-12-16 10:57:37 【问题描述】:

我正在使用 C#Xaml 制作 UWP 桌面 应用程序,它是学校项目的银行应用程序,我正在为支付历史逻辑而苦苦挣扎.

我希望用户在 Page1 上的文本框中输入一些价格,然后他会按下按钮,之后应用程序将导航到主屏幕。 如果支付成功(这个逻辑已经在我的应用程序中,你不必关注它)在 Page2 中的文本块将被创建(但用户将无法除非他打开Page2

页面 1.xaml

<Grid>
    <StackPanel Orientation="Vertical" VerticalAlignment="Top">
        <TextBox x:Name="Money" Height="100" Header="Enter your money"/>
        <Button
                x:Name="MyBtn"
                Click="Button_Click"
                Content="Ok"
                Margin="30"/>
    </StackPanel>
</Grid>

页面 1.xaml.cs

public partial class Page1 : Page

    public Page1()
    
        this.InitializeComponent();
    

    public delegate void PaymentEventHandler(object sender, EventArgs args);

    public event PaymentEventHandler SuccessfullPayment;

    protected virtual void OnSuccessfullPayment()
    
        if (SuccessfullPayment != null)
        
            SuccessfullPayment(this, EventArgs.Empty);
        
    

    private void Button_Click(object sender, RoutedEventArgs e)
    
        //in case that payment is successful (this logic is unnecesary in this example)

        OnSuccessfullPayment();
        this.Frame.Navigate(typeof(MainBankPage)); 
    



页面 2.xaml

<Grid>  
    <ScrollViewer>
        <StackPanel x:Name="RootLayout" Orientation="Vertical" />
    </ScrollViewer>
</Grid>

页面 2.xaml.cs

public sealed partial class Page2 : Page

    public Page2()
    
        this.InitializeComponent();
    

    
    public void Initialization()
    
        var payment= new Page1();
        payment.SuccessfullPayment += CreateTextBlock;
    

    public void CreateTextBlock(object sender, EventArgs e)
    
        var textblock = new TextBlock();
        textblock.Margin = new Thickness(0, 20, 15, 0);
        textblock.Width = 400;
        textblock.Height = 60;
        textblock.FontSize = 20;
        textblock.HorizontalAlignment = HorizontalAlignment.Left;
        textblock.Text = "Payment was successfull";
        RootLayout.Children.Add(textblock);
    
    
    

主页

只有 6 个按钮可供用户交互以在我的应用中的页面之间导航,所以我认为没有必要显示代码

我试图通过自定义事件来做到这一点(在示例中显示),但它不起作用。

我是应用程序开发的新手,所以如果这是一种愚蠢的做法,我愿意接受其他选择

注意:我的应用程序要复杂得多,我只是想知道如何做这个特定的事情,所以我创建了这个简单的例子 :)

如果不发表评论,希望您能清楚一切,我会尽我所能改善这个问题。

非常感谢您的时间和回答。

【问题讨论】:

你确实想实现什么?预期的行为是什么?将数据从 Page1 传递到 Page2? 因此,例如,用户将“进行有效付款(5 欧元)”,而不是他可以在应用程序中做任何他想做的事情。但在幕后,将在 page2 文本块中创建“付款成功”的文本,但用户只有在导航到该页面时才能看到它。希望你现在明白 :) 如果不告诉我 根据您的描述,@mm8 的解决方案应该能够做到这一点。或者更进一步,您可以创建一个单例来传递您的参数。 【参考方案1】:

如果没有人注册处理事件,那么引发事件是没有意义的。如果我正确理解了您的问题,那么在您从 Page1 引发事件时没有创建 Page2,因此这将不起作用。

您可以将信息存储在某个全局对象中,而不是引发事件,该对象可以随时从应用程序中的任何位置访问。

例如,您可以创建一个静态类:

public static class AppInfo

    public static string SharedInfo  get; set; 

...并从任何页面获取和设置它的属性,例如:

第 1 页

private void Button_Click(object sender, RoutedEventArgs e)

    //in case that payment is successful (this logic is unnecesary in this example)
    AppInfo.SharedInfo = "Payment was successfull";
    OnSuccessfullPayment();
    this.Frame.Navigate(typeof(MainBankPage)); 

第2页

public void Initialization()

    var textblock = new TextBlock();
    textblock.Margin = new Thickness(0, 20, 15, 0);
    textblock.Width = 400;
    textblock.Height = 60;
    textblock.FontSize = 20;
    textblock.HorizontalAlignment = HorizontalAlignment.Left;
    textblock.Text = AppInfo.SharedInfo;
    RootLayout.Children.Add(textblock);

【讨论】:

我很抱歉没有说清楚。 'Page 2' 已经被装箱,用户可以随时在'Page 1' 中付款。并且应用程序每次都必须在第 2 页中创建新的文本块。在“第 2 页”上可以有与用户成功付款一样多的文本块。它类似于真实银行应用程序中的付款历史记录。而且我的应用程序比这大得多,这只是“简单的例子”,因为我不知道如何让支付历史思考。希望你能帮助我度过一个愉快的夜晚:) 它是如何创建的?您是否/如何一次显示多个页面? 它的创建正如我所提到的,有一个名为 MainPage 的页面,用户可以在这里转到我的应用程序的另一个页面,并且从 MainPage 用户可以转到 Page1 或 Page2。我想根据付款是否成功创建文本框。 @wpsimon09 通常,除非用户导航到它,否则不会创建 Page 对象。当导航时调用typeof(Page),Page2会被创建。我同意@mm8,不需要自定义事件。 @mm8 关于将信息保存到全局对象中的解决方案仍然适用于您的场景。 好的,谢谢,我会尝试使用它:)

以上是关于将自定义事件表单从一页发送到另一页的主要内容,如果未能解决你的问题,请参考以下文章

从一页导航到另一页后脚本未加载

从一页切换到另一页

从一页到另一页的反应导航不起作用

如何使用 StreamBuilder 从一页导航到另一页

如何在 django 中从一页转到另一页

将对象从一页移动到另一页?