Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从弹出窗口返回对象_C#_Wpf - Fatal编程技术网

C# 从弹出窗口返回对象

C# 从弹出窗口返回对象,c#,wpf,C#,Wpf,我有一个弹出另一个窗口的窗口。我希望第二个窗口能够在按下按钮时将对象返回到第一个窗口。如何执行此操作?您可以在第二个窗口上公开属性,以便第一个窗口可以检索它 public class Window1 : Window { ... private void btnPromptFoo_Click(object sender, RoutedEventArgs e) { var w = new Window2(); if (w.ShowDialo

我有一个弹出另一个窗口的窗口。我希望第二个窗口能够在按下按钮时将对象返回到第一个窗口。如何执行此操作?

您可以在第二个窗口上公开属性,以便第一个窗口可以检索它

public class Window1 : Window
{
    ...

    private void btnPromptFoo_Click(object sender, RoutedEventArgs e)
    {
        var w = new Window2();
        if (w.ShowDialog() == true)
        {
            string foo = w.Foo;
            ...
        }
    }
}

public class Window2 : Window
{
    ...

    public string Foo
    {
        get { return txtFoo.Text; }
    }

}

如果您不想公开属性,并且希望使用法更加明确,则可以重载
ShowDialog

public DialogResult ShowDialog(out MyObject result)
{
   DialogResult dr = ShowDialog();
   result = (dr == DialogResult.Cancel) 
      ? null 
      : MyObjectInstance;
   return dr;
}

我知道这是一个旧的,但我正在为我正在开发的WPF应用程序寻找相同的信息。我发现这个网站非常有用:

这是为Windows窗体编写的,但是如果您忽略了将值传递到新窗口的部分,它仍然有效,并且提供了一些非常好的信息

另一方面,要将值传递给新窗口,这非常有用:


神圣的火星母亲,我花了很长时间才明白:

窗口1:

if ((bool)window.ShowDialog() == true)
{
   Window2 content = window.Content as Window2;
   string result = content.result;
   int i = 0;
}
窗口2:

public partial class Window2 : UserControl
{
    public string result
    {
        get { return resultTextBox.Text; }
    }

    public Window2()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Window.GetWindow(this).DialogResult = true;
        Window.GetWindow(this).Close();
    }
}
XAML:


我就是这样做的

在父窗口中,按如下方式创建相应的ClosingEvent:

private void NewWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        NewWindow nw = (NewWindow)sender;

        object Receiver = nw.Sender;
    }
    public partial class NewWindow : Window
{
    public object Sender { get; set; }

    public NewWindow()
    {
        InitializeComponent();

        Sender = objectYouWantToSend;
    }
}
…并在子窗口中更改代码,实现如下“发件人”:

private void NewWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        NewWindow nw = (NewWindow)sender;

        object Receiver = nw.Sender;
    }
    public partial class NewWindow : Window
{
    public object Sender { get; set; }

    public NewWindow()
    {
        InitializeComponent();

        Sender = objectYouWantToSend;
    }
}
因此,当您将数据放入子窗口中的对象“Sender”时,关闭此窗口将把数据放入“Receiver”变量


我希望这会有所帮助。

您可以简单地调用弹出窗口的任何方法,如下所示:

int value = 0;
if ((bool)poupWindow.ShowDialog() == true) {
  value = poupWindow.GetValue();
}

新窗口是第一个窗口的模态吗?起初我甚至不知道模态窗口是什么,但我想出来了。下面Thomas的代码稍微编辑一下就成功了。这不起作用,因为用户与窗口交互并在我希望父窗口获取值之前按下一个按钮。我找到了答案。问题是它应该是if(w.ShowDialog()==false)。@reflow:你确定吗?当用户取消对话框时,ShowDialog返回false,因此在这种情况下,您可能不想考虑该值,这可能是因为在我的情况下,用户按下的按钮也会关闭窗口。您应该显式设置DialogResult,然后欢迎使用StackOverflow。虽然你提供的链接可能会有所帮助,但最好还是直接把要点放在你的帖子上。这样,如果链接断开,您的答案就不会变得无关紧要,而且更容易使用,也更有用。因此,我建议相应地编辑您的答案。顺致敬意,