C# 在Rx.Net上急需帮助
嗨,伙计们,我是Rx的新手,我正在尝试组装一个简单的测试应用程序。它基本上使用Rx订阅窗口点击事件,并将文本框上的文本设置为“点击”。这是一个wpf应用程序。以下是xaml: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
<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
。就像在关闭表单时删除事件处理程序一样,完成后也应该处理订阅。可能您可以从以下示例获得帮助。也许你可以从下面的例子中得到帮助。