WPF使用语句打开另一个窗体。

4

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

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

            }

这个很好,我使用showSelection表单中的以下代码从listBox2中发送了所选项目,并接收到了showID和numOfSeasons:

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窗口只是带有单个按钮的数据网格。


1
你的 ShowSelection 窗口没有实现 IDisposable 接口,请在窗口代码后台实现 IDisposable 接口。请参考 http://stackoverflow.com/questions/4450904/idisposable-member-of-wpf-window-class。 - Janne Matikainen
不要像编写WinForms一样编写WPF...否则你会错过所有好玩的东西。 - blindmeis
2个回答

8
WPF组件不使用Win32句柄(Window除外,但它进行自我管理),因此它们不需要是IDisposable的,您也不需要在using块中对它们进行Dispose处理或使用它们。
一旦您的Window没有更多引用,它将由垃圾回收器标记为可回收,与其他.NET纯组件相同。
如果您想在using块中使用它,可以手动在窗口上实现IDisposable,但确实不需要。
如果您想手动删除资源(并继续在using块中使用它),那么可以做的最简单的事情:
public class ShowSelection : Window, IDisposable
{
    public void Dispose()
    {
      /* here you'd remove any references you don't need */
    }
}

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

谢谢!我想我应该研究一下如何从窗口中获取数据。 - Jrow
1
@Jrow,它应该完全相同,你只是不使用using块,但你确实使用ShowSelection showSelection = new ShowSelection(showListBox.SelectedItem.ToString())。然而,如果使用WPF,我会研究MVVM模式并使用ViewModel将数据绑定到(这超出了本问题的范围)。 - Jcl

1
这段话的意思是,ShowSelection类没有继承自IDisposable接口,因此可以不使用using语句,直接实例化ShowSelection对象,并访问其属性。具体实现方式为:

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

然后通过showSelection.#####来访问需要的属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接