【问题标题】:WPF using statement to open another formWPF 使用语句打开另一个表单
【发布时间】:2016-01-11 13:59:35
【问题描述】:

我在 Winforms 中编写了一个 C# 应用程序,现在正在 WPF 中重写它。在 Winforms 版本中,我使用以下命令打开另一个窗口,同时向其发送信息并从中接收信息:

using (showSelection showSelection1 = new showSelection(listBox2.SelectedItem.ToString()))
            {
                showSelection1.ShowDialog();               
                storage1.showID = showSelection1.showID;
                storage1.numOfSeasons = showSelection1.numOfSeasons;

            }

这很好,我从 listBox2 发送了选定的项目,并在 showSelection 表单中使用此代码收到了 showIDnumOfSeasons

this.showID = Convert.ToInt32(dataGridView1[2, dataGridView1.CurrentCell.RowIndex].Value);
this.numOfSeasons = dataGridView1[1, dataGridView1.CurrentCell.RowIndex].Value.ToString();
this.Close();

现在,在 WPF 版本中,我尝试了同样的事情:

using (ShowSelection showSelection = new ShowSelection(showListBox.SelectedItem.ToString()))
            {

            }

但是在using( ) 里面我得到了这个错误: ShowSelection: type used in a using statement must be implicitly convertible to 'System.IDisposable'

我不确定从这里到哪里。我可以解决这个问题并且仍然以同样的方式去做,还是有不同的方式我应该这样做? ShowSelection 窗口只是一个带有单个按钮的数据网格。

【问题讨论】:

  • 你的 ShowSelection 窗口没有实现 IDispoable,在后面的窗口代码中实现 IDisposable。见stackoverflow.com/questions/4450904/…
  • 不要像编写 winforms 那样编写 wpf... 你会错过所有好东西。

标签: c# wpf winforms


【解决方案1】:

WPF 组件不使用 Win32 句柄(Window 使用,但它可以自行管理),因此它们不需要是 IDisposable,您也不需要 Dispose 它们或在using 块。

一旦没有更多对您的 Window 的引用,它将被 GC 标记为收集,与其他纯 NET 组件一样。

如果你想在using 块中使用它,你可以在你的窗口上手动实现IDisposable,但这确实不是必需的。

如果您想手动删除资源(并在 using 块中继续使用它),那么您可以做最简单的事情:

public class ShowSelection : Window, IDisposable
{
    public void Dispose()
    {
      /* here you'd remove any references you don't need */
    }
}

但除非有必要,否则我建议不要这样做

【讨论】:

  • 谢谢!我想我应该研究一下我应该如何从窗口取回数据。
  • @Jrow 它应该是完全一样的,你只是不使用using 块,但你使用ShowSelection showSelection = new ShowSelection(showListBox.SelectedItem.ToString())。但是,如果使用 WPF,我会研究 MVVM 模式并使用 ViewModel 将您的数据绑定到(尽管这超出了这个问题的范围)
【解决方案2】:

它只是说 ShowSelection 类不是从 IDisposable 派生的 所以不用 using 就可以使用它:

ShowSelection showSelection = new ShowSelection(showListBox.SelectedItem.ToString());

然后访问您需要的属性: 显示选择。#####

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多