Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 包含IDisposable成员的WPF控件_C#_.net_Wpf - Fatal编程技术网

C# 包含IDisposable成员的WPF控件

C# 包含IDisposable成员的WPF控件,c#,.net,wpf,C#,.net,Wpf,我在WPF代码中有一个成员是可丢弃的(这意味着它实现了IDisposable接口) 我没有看到任何可以从WPF中的UserControl重写的Dispose方法,因此我可以在WPF UserControl中处置该成员 处置WPF usercontrol中的成员的正确方法是什么 它是一个usercontrol,包装实现IDisposable接口的私有成员。因此,我需要在某个地方处置该成员。在传统的winform中,usercontrol有一个可以重写的Dispose方法,以便在重写中我可以释放私有

我在WPF代码中有一个成员是可丢弃的(这意味着它实现了IDisposable接口)

我没有看到任何可以从WPF中的UserControl重写的Dispose方法,因此我可以在WPF UserControl中处置该成员

处置WPF usercontrol中的成员的正确方法是什么

它是一个usercontrol,包装实现IDisposable接口的私有成员。因此,我需要在某个地方处置该成员。在传统的winform中,usercontrol有一个可以重写的Dispose方法,以便在重写中我可以释放私有成员。但是在WPF用户控件中,没有这样的东西。所以我想知道我在哪里可以处理wpf用户控件中的私有成员


我的问题不是关于处理usercontrol,而是在何处处理其实现IDisposable接口的私有成员

您可以使用usercontrol的卸载事件来进行资源清理。

更新

当您调用实现IDisposable的私有成员时,是否可以使用
?这样,它就会被自动处理掉。我个人并没有在UserControl中这样做,但它可能会奏效。e、 g

using( MyPrivateDisposable mpd = new MyPrivateDisposable) {
    mpd.MethodA();
}
旧答案

如果不能调用Dispose(),问题是您的UserControl没有从Disposable()继承。UserControl本身不是从它派生的,因此您必须显式地使WPF控件继承自它,即

public class MyControl : UserControl, IDisposable {...}
请参见此处的UserControl基本类型:


一旦实现IDisposable,就可以调用它。但正如我在对你的问题的评论中所写的,我认为你需要发布更多关于这门课的信息。问问自己是否真的需要调用Dispose()。。。i、 您的用户控制访问句柄,还是使用非托管代码?如果没有,我不明白为什么必须对其调用Dispose(),除非您确实希望GC清理它。

您可以在Dispatcher.ShutDownStarted事件处理程序中执行此操作。有关详细信息,请参见。

这是标准方法吗?标准方法是通过类似MVVM/MVP模式之类的方式消除代码隐藏,并在更高级别上处理处理处理。这不起作用。来自MSDN文档:请注意,卸载事件在应用程序开始关闭后不会引发。当ShutdownMode属性定义的条件发生时,应用程序将关闭。如果将清除代码放置在卸载事件的处理程序中,例如窗口或UserControl,则可能不会按预期调用它。+1用于调用卸载的代码在这里不太可能有帮助。我在一些遗留代码中也遇到过类似的问题,其中UserControl在代码后面分配了一堆东西,但当控件消失时,却没有提供清理自己的机会。当元素只是从可视树中移除而不是永久关闭时,您不太可能打算执行此类清理+1这里还有一个正确的答案,即首先不要在视图中执行这些分配,而是在ViewModel中执行这些分配。不用说,我的遗留代码不是特别的MVVM!事实并非如此。如果需要清理非托管资源,则应在正确实现IDisposable模式的同时实现终结器。Disposing主要用于在确定的时间释放资源,而不是绝对确保不泄漏非托管内容。本例仅涉及在UserControl“死亡”时处理私有成员。是否确实需要调用Dispose()?这是你自己的WPF控制吗?它是否包装需要清理的非托管代码?或者它使用了大量内存,因此需要使用Dispose()强制GC更快地清理?我还没有对我的任何用户控件调用Dispose(),也没有(还)看到任何内存泄漏。您能在这里提供有关UserControl的更多信息吗?请参阅下面我更新的答案——它可能会帮您解决问题,这样您就不必添加卸载的事件处理程序。我知道wpf中的UserControl没有实现IDisposable。但我的问题不是关于处理usercontrol…好的,看起来你又编辑了你的问题,谢谢,我看到你实现了IDisposable@pdidy好的,现在我明白你的问题了。谢谢你的回答。但在我的情况下,我不想使用不同的原因。所以我需要保留一个私人会员,以后再处理…好的,没问题。只要你有一个有效的问题解决方案,一切都好。:)