【问题标题】:Return value without close the window wpf返回值而不关闭窗口wpf
【发布时间】:2017-11-24 01:18:14
【问题描述】:

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

我有一个内部带有 WPF 用户控件的 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 能解决吗?

【问题讨论】:

  • 对话框必须是模态的吗?为什么不将数据/结果存储在 ViewModel 中并简单地创建对话框的新实例并将其指向同一个 ViewModel 实例?

标签: c# wpf dll window


【解决方案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();

【讨论】:

    【解决方案2】:

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

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

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

    所以我想你的问题的答案是否定的。您无法重新打开已关闭的对话窗口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多