【问题标题】:C# - Return variable from child window to parent window in WPFC# - 在 WPF 中将变量从子窗口返回到父窗口
【发布时间】:2014-03-03 16:40:25
【问题描述】:

我有一个名为 form1 的主窗口。在 form1 中我有一个按钮,按下它会打开 form2 (form2.ShowDialog())。在 form2 中,我有一个名为“检查”的按钮。当用户单击“检查”时,它应该进行一些验证,如果成功则创建一个字符串对象并将其返回给 form1。关于如何实现这一点的任何想法?当用户关闭窗口时,我不想返回任何东西。

【问题讨论】:

    标签: c# wpf variables


    【解决方案1】:

    在你的第二个窗口中创建一个事件,让事件委托的参数包含你想要传递的任何信息:

    public class Popup : Window
    {
        public event Action<string> Check;
    
        public void Foo()
        {
            //fire the event
            if (Check != null)
                Check("hello world");
        }
    }
    

    然后主窗口可以订阅该事件以使用信息做它想做的事:

    public class Main : Window
    {
        private Label label;
        public void Foo()
        {
            Popup popup = new Popup();
            popup.Check += value => label.Content = value;
            popup.ShowDialog();
        }
    }
    

    【讨论】:

    • 打败我。就个人而言,我喜欢这种窗口间通信的方法。但是,还有另一种我也很喜欢的方法,我将在下面发布包含该方法的答案。
    • 工作完美。谢谢!
    • 如果我有两个字符串怎么办?怎么写代码?? popup.Check += value =&gt; label.Content = value, label2.Content = value;??
    • @SizzlingCode 然后你使用语句 lambda 而不是表达式 lambda,或者你只是将一个赋值的结果分配给下一个标签..
    • 谢谢先生。但是如果可以的话,你能举个例子吗,因为我对 C# 和 WPF 应用程序真的很陌生。从 PHP 开发转移。我已经发布了一个关于这个的问题。stackoverflow.com/questions/31877458/… 如果没问题,请看看我的问题。
    【解决方案2】:

    这个答案虽然不是完美的目标,但对于在这里谷歌搜索如何在窗口之间通信的一般解决方案的人来说会更有用:

    根本没有理由设置事件来访问应用程序主窗口的对象。您可以简单地在弹出代码上调用它们并完成它:

    ((MainWindow)Application.Current.MainWindow).textBox1.Text = "Some text";
    

    【讨论】:

      【解决方案3】:

      这可以通过多种方式实现。 Servy 发布的方法非常好,可以完成您所需要的。我更希望看到Action&lt;sting&gt; 作为参数传递给构造函数并命名为callback,所以很清楚它的用途,但这只是一个偏好。

      另一种非常擅长完成这项工作的方法是通过消息传递。 MVVMLight Toolkit 提供了一个很棒的小功能来完成这样的任务。

      第 1 步:创建强类型消息:

      public class MyMessage : MessageBase
      {
          //Message payload implementation goes here by declaring properties, etc...
      }
      

      第 2 步:确定发布该消息的地点和时间。

      public class PublishMessage
      {
          public PublishMessage(){
          }
      
          public void MyMethod()
          {
              //do something in this method, then send message:
              Messenger.Default.Send(new MyMessage() { /*initialize payload here */ });
          }
      }
      

      Setp 3:现在您正在发送消息,您需要能够接收该消息:

      public class MessageReceiver
      {
          public MessageReceiver()
          {
              Messenger.Default.Register<MyMessage>(this, message => Foo(message));
          }
      
          public void Foo(MyMessage message)
          {
              //do stuff
          }
      }
      

      【讨论】:

      • 虽然您没有提供足够的实现来确定,但您在这里所拥有的似乎或多或少是一个任何人都可以触发的公共静态事件。其他类型不再发现可能要订阅哪些事件,当他们确实遇到消息时,没有任何内置指示来说明它的含义,谁对它“负责”,它是什么与等相关联。也有可能(并且很容易错误地)最终触发不正确的消息,从而在两个不同的地方引起问题。我真的看不出这里有什么优势。
      • 我没有说这是一个优势。只是另一种方式。在这种情况下,通过查找您的消息并检查谁使用它,实际上很容易找出谁订阅了什么消息。它是强类型的,所以毫无疑问您正在发送和接收什么消息。消息接收者负责如何处理消息。发件人只是举起一个标志来表示某事已经完成。发送不适当的消息很难做到,但有可能,只需要开发人员注意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      相关资源
      最近更新 更多