C# 在Rx.Net上急需帮助

C# 在Rx.Net上急需帮助,c#,wpf,system.reactive,C#,Wpf,System.reactive,嗨,伙计们,我是Rx的新手,我正在尝试组装一个简单的测试应用程序。它基本上使用Rx订阅窗口点击事件,并将文本框上的文本设置为“点击”。这是一个wpf应用程序。以下是xaml: <Window x:Class="Reactive.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/win

嗨,伙计们,我是Rx的新手,我正在尝试组装一个简单的测试应用程序。它基本上使用Rx订阅窗口点击事件,并将文本框上的文本设置为“点击”。这是一个wpf应用程序。以下是xaml:

<Window x:Class="Reactive.MainWindow"  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
      Title="MainWindow" Height="350" Width="525">  
   <Grid>  
      <Canvas>  
        <TextBlock Name="txtClicked" Text="Rx Test"/>            
    </Canvas>  
 </Grid>  

下面是隐藏的代码:

using System;  
using System.Linq;  
using System.Windows;  
using System.Windows.Input;  

namespace Reactive  
{
  /// <summary>  
  /// Interaction logic for MainWindow.xaml  
  /// </summary>  
public partial class MainWindow : Window  
{  
    /// <summary>  
    /// Initializes a new instance of the <see cref="MainWindow"/> class.  
    /// </summary>  
      public MainWindow()  
      {  
        InitializeComponent();  

        var xs = from evt in Observable.FromEvent<MouseEventArgs>(this, "MouseDown")
                 select evt;

        xs.ObserveOnDispatcher().Subscribe(value => txtClicked.Text = "Clicked");
    }
}
}
使用系统;
使用System.Linq;
使用System.Windows;
使用System.Windows.Input;
命名空间反应
{
///   
///MainWindow.xaml的交互逻辑
///   
公共部分类主窗口:窗口
{  
///   
///初始化类的新实例。
///   
公共主窗口()
{  
初始化组件();
var xs=来自Observable.FromEvent中的evt(此为“鼠标向下”)
选择evt;
xs.ObserveOnDispatcher().Subscribe(值=>txtClicked.Text=“Clicked”);
}
}
}
但由于某些原因,代码无法运行。我得到的信息是:

对与指定绑定约束匹配的类型“Reactive.MainWindow”调用构造函数时引发异常。“行号“3”和行位置“9”

InnnerException消息:

事件委托的形式必须为void处理程序(object,T),其中T:EventArgs


请帮忙

我现在无法检查,但我相信问题在于您使用了错误的
EventArgs
类。
窗口.MouseDown
事件的类型为
MouseButtonEventHandler
,因此您应该使用
MouseButtonEventArgs

var xs = Observable.FromEvent<MouseButtonEventArgs>(this, "MouseDown");
var xs=Observable.FromEvent(这是“MouseDown”);

(在本例中,您的查询表达式实际上没有起到任何作用-如果您想添加where子句等,可以将其放回原处)。

我现在无法检查,但我相信问题在于您使用了错误的
EventArgs
类。
窗口.MouseDown
事件的类型为
MouseButtonEventHandler
,因此您应该使用
MouseButtonEventArgs

var xs = Observable.FromEvent<MouseButtonEventArgs>(this, "MouseDown");
var xs=Observable.FromEvent(这是“MouseDown”);

(在本例中,您的查询表达式实际上没有做任何事情-如果您想添加where子句等,可以将其放回原处)

可能太晚了,但我建议您在需要从事件中观察时使用强类型的
FromEventPattern
方法

IObservable<IEvent<TEventArgs>> FromEventPattern<TDelegate, TEventArgs>(
    Func<EventHandler<TEventArgs>, TDelegate> conversion,
    Action<TDelegate> addHandler,
    Action<TDelegate> removeHandler)
    where TEventArgs: EventArgs
IObservable FromEventPattern(
Func转换,
动作addHandler,
动作(removeHandler)
其中TEventArgs:EventArgs
在代码中,您可以这样使用它:

public partial class MainWindow : Window  
{  
    /// <summary>  
    /// Initializes a new instance of the <see cref="MainWindow"/> class.  
    /// </summary>  
    public MainWindow()  
    {  
        InitializeComponent();  

        var xs = Observable
            .FromEventPattern<MouseButtonEventHandler, MouseButtonEventArgs>(
                h => (s, ea) => h(s, ea),
                h => this.MouseDown += h,
                h => this.MouseDown -= h);

        _subscription = xs
            .ObserveOnDispatcher()
            .Subscribe(_ => txtClicked.Text = "Clicked");
    }

    private IDisposable _subscription = null;
}
公共部分类主窗口:窗口
{  
///   
///初始化类的新实例。
///   
公共主窗口()
{  
初始化组件();
var xs=可观测
.FromEventPattern(
h=>(s,ea)=>h(s,ea),
h=>this.MouseDown+=h,
h=>this.MouseDown-=h);
_订阅=xs
.ObserveOnDispatcher()
.Subscribe(=>txtClicked.Text=“Clicked”);
}
私有IDisposable _subscription=null;
}

您还应该使用订阅变量(或订阅列表)来保存从
Subscribe
调用返回的
IDisposable
。就像在关闭表单时删除事件处理程序一样,完成后也应该处理订阅。

可能太晚了,但我建议您在需要从事件中观察时使用强类型
FromEventPattern
方法

IObservable<IEvent<TEventArgs>> FromEventPattern<TDelegate, TEventArgs>(
    Func<EventHandler<TEventArgs>, TDelegate> conversion,
    Action<TDelegate> addHandler,
    Action<TDelegate> removeHandler)
    where TEventArgs: EventArgs
IObservable FromEventPattern(
Func转换,
动作addHandler,
动作(removeHandler)
其中TEventArgs:EventArgs
在代码中,您可以这样使用它:

public partial class MainWindow : Window  
{  
    /// <summary>  
    /// Initializes a new instance of the <see cref="MainWindow"/> class.  
    /// </summary>  
    public MainWindow()  
    {  
        InitializeComponent();  

        var xs = Observable
            .FromEventPattern<MouseButtonEventHandler, MouseButtonEventArgs>(
                h => (s, ea) => h(s, ea),
                h => this.MouseDown += h,
                h => this.MouseDown -= h);

        _subscription = xs
            .ObserveOnDispatcher()
            .Subscribe(_ => txtClicked.Text = "Clicked");
    }

    private IDisposable _subscription = null;
}
公共部分类主窗口:窗口
{  
///   
///初始化类的新实例。
///   
公共主窗口()
{  
初始化组件();
var xs=可观测
.FromEventPattern(
h=>(s,ea)=>h(s,ea),
h=>this.MouseDown+=h,
h=>this.MouseDown-=h);
_订阅=xs
.ObserveOnDispatcher()
.Subscribe(=>txtClicked.Text=“Clicked”);
}
私有IDisposable _subscription=null;
}

您还应该使用订阅变量(或订阅列表)来保存从
Subscribe
调用返回的
IDisposable
。就像在关闭表单时删除事件处理程序一样,完成后也应该处理订阅。

可能您可以从以下示例获得帮助。也许你可以从下面的例子中得到帮助。