Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 何时使用WPF中的Rx处理鼠标事件_C#_Wpf_System.reactive - Fatal编程技术网

C# 何时使用WPF中的Rx处理鼠标事件

C# 何时使用WPF中的Rx处理鼠标事件,c#,wpf,system.reactive,C#,Wpf,System.reactive,给定以下代码: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var mouseMove = Observable .FromEventPattern<MouseEventHandler, MouseEventArgs>( eventHandler =>

给定以下代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var mouseMove = Observable
            .FromEventPattern<MouseEventHandler, MouseEventArgs>(
            eventHandler => this.MouseMove += eventHandler,
            eventHandler => this.MouseMove -= eventHandler);

        var mouseMoveSubscription = mouseMove.Subscribe(args =>
        {
            //Do Something
        });
    }
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var mouseMove=可观察
.FromEventPattern(
eventHandler=>this.MouseMove+=eventHandler,
eventHandler=>this.MouseMove-=eventHandler);
var mouseMoveSubscription=mouseMove.Subscribe(args=>
{
//做点什么
});
}
}

如果我希望订阅遵循主窗口的生命周期,则正确的\最佳处置位置\取消订阅mouseMoveSubscription。我主要担心的是,我不会导致持续超过windows生命周期的内存泄漏。谢谢。

我认为从窗口生命周期的角度来看,最好的地方是活动


这是窗口关闭过程的开始(如图所示)或)-我发现最好在我知道要卸载(或在这种情况下取消订阅)所有内容后立即卸载。如果您需要以任何理由尽可能长的订阅,请使用<代码>关闭< /代码>。

以RX更复杂的方式来做这件事,考虑从上面提到的“关闭事件”中创建一个可观察流。 e、 g。 var closingObservable=Observable.FromEventPattern(this.Closing…等) 然后,修改您的查询以使用Take,直到: mouseMove.TakeUntil(closingObservable).Subscribe(args=>


然后你就不必关心自己的明确处置。

我大体上同意@Honza的观点,即
关闭
是做这件事的合适地方,但我通常遵循这种模式来“托管”
IDisposables
;在某些地方,这可能有点过火,但我发现它是一种足够轻的模式,因此通常适用于:

// Window, application, etc - some longish-living object
public class Something : IDisposable
{
    CompositeDisposable _disposables = new CompositeDisposable();

    public Something()
    {
         // A composite disposable acts like a "bucket" of IDisposables
         // that are all disposed when the bucket is disposed.
          _disposables.Add(SomeObservable.Subscribe(...));
          _disposables.Add(SomeOtherObservable.Subscribe(...));
          _disposables.Add(YetAnotherObservable.Subscribe(...));

         // Here, optionally wire some "Yo, I should dispose when this happens" handler
         this.Closed += (o,e) => Dispose();
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            // clean up managed resources here
            if(_disposables != null)
            {
                _disposables.Dispose();
            }
        }   
        // clean up unmanaged resources here
    }

    ~Something()
    {
        Dispose(false);
    }
}

如果我在关闭事件中执行此操作,但我有几个订阅关闭事件的订阅方,其中一个尝试取消关闭,您将如何处理这种情况。我将使用
关闭
事件。它仅在窗口真正关闭时才会被触发。之后还有一个事件,
卸载
,但可能会出现一些问题是的。