返回值而不关闭窗口wpf

时间:2017-06-21 08:41:05

标签: c# wpf dll window

我希望从我的WPF窗口获得一个返回值而不关闭它。

我有一个带有WPF usercontrol的DLL,我从我的DLL代码中调用它。 我必须调用它,它返回数据,然后我发送数据。 但我不想创建同一窗口的两个不同实例。

我的代码:

        MP.UserControl1 a = new MP.UserControl1();
        a.ShowDialog();

        if (a.DialogResult.HasValue && a.DialogResult.Value == true)
        {
            a.Hide();
            InitialDatas = a.inputData;
        }
        else
            return 0;

然后我详细说明了InitialDatas

现在我想在我的“a”中调用一个方法,并再次显示它,而不会创建一个新窗口。

代码:

        a.SetValue(result, off1, InitialDatas);
        a.ShowDialog();

我收到错误消息:窗口关闭后无法设置可见性或调用Show,ShowDialog或EnsureHandle 有可能解决吗?

2 个答案:

答案 0 :(得分:2)

如错误消息所示,您无法关闭窗口,然后再次打开它。

您可以通过调用Hide()方法隐藏它,而不是关闭窗口,然后通过调用Show()方法再次显示它。

但是由于ShowDialog()方法在窗口关闭之前不会返回,但这对于对话框窗口不起作用。如果需要模态窗口,则必须创建窗口的新实例并打开此窗口。但这不应该是一个问题。

所以我猜你问题的答案根本就是不。您无法重新打开关闭的对话窗口。

答案 1 :(得分:1)

我会用事件模型来解决这个问题。您可以执行以下操作:

  • 在表单
  • 中创建一个事件
  • 在调用者
  • 中创建一个事件处理程序
  • 订阅活动并执行您的逻辑

被叫表格:

namespace MyApplication
{
    public delegate void MyEventHandler(object source, EventArgs e);

    public class MyForm : Form
    {
        public event MyEventHandler OnInitialData;

        private void btnOk_Click(object sender, EventArgs e)
        {
             OnInitialData?.Invoke(this, null);
        }
    }
}

在您的其他表格中:

MP.UserControl1 a = new MP.UserControl1();
a.OnInitialData += UCA_OnInitialData;

private void UCA_OnInitialData(object sender, EventArgs e)
{
    MP.UserControl1 a = sender as MP.UserControl1;
    a.SetValue(result, off1, a.inputData);
}
a.ShowDialog();