【发布时间】:2020-05-09 19:27:39
【问题描述】:
我正在使用 WPF 和 C# 构建一个屏幕键盘,我想知道当我单击按钮时如何告诉我的程序在活动窗口中输入文本。我希望它表现得像其他屏幕键盘一样。
【问题讨论】:
我正在使用 WPF 和 C# 构建一个屏幕键盘,我想知道当我单击按钮时如何告诉我的程序在活动窗口中输入文本。我希望它表现得像其他屏幕键盘一样。
【问题讨论】:
一种方法是使用 Messenger,就像它在 MVVM 模式中很常见。
你可以给messenger注册一个方法:
messengerInstance.Register<objecttype>(object recipient, string identCode, Action<objecttype> method);
你可以这样发送消息:
messengerInstance.Send<objecttype>(object obj, string identCode);
例如,您有一个方法MyMethod(string str)。然后就可以注册了
messengerInstance.Register<string>(this /*you are referring to this instance*/, "MyCode", MyMethod);
现在你在另一个班级发送消息:
messengerInstance.Send<string>("A", "MyCode");
现在发生的情况是,注册到代码“MyCode”的每个方法都将“A”作为参数并被执行。
更大的例子:
public class A
{
private Messenger messenger = Messenger.Instance; //Messenger is singleton, means it is build to only have one instance
public A()
{
messenger.Register<string>(this, "MyCode", MyMethod);
}
private void MyMethod(string str)
{
Console.WriteLine(str);
}
}
public class B
{
private Messenger messenger = Messenger.Instance;
public B()
{
messenger.Send<string>("Hello, World!", "MyCode");
}
}
当 B 类被初始化时,构造函数发送消息“Hello, World!”使用 IdentCode “MyCode”。现在 A 类收到通知“我有消息 Hello, World! 给所有注册到 MyCode 的人”。 A 类看到 MyMethod 已注册到此代码并传递消息“Hello,World!”到方法。最后你会得到输出“Hello, World!”
当然这是简化的,有很多可能性来创建这样的信使,这只是我使用的版本,但它非常没有压力,你基本上可以将信件发送到文本框。当然,您可以发送任何您喜欢的对象。例如
//an integer
messenger.Send<int>(10, "MyCode");
//a boolean
messenger.Send<bool>(true, "MyCode");
//or even other classes
messenger.Send<MyClass>(new MyClass(), "MyCode");
这是我在工作中使用的 Messenger 类:https://pastebin.com/k6q9Y6rR
【讨论】:
您的按钮是否订阅了某种点击事件?如果是这样,您可以通过将按钮字符串值连接到活动窗口中的当前值来将按钮具有的值添加到您正在谈论的活动窗口中。如果没有点击事件,你可以添加一个,然后按照我上面提到的做
如何订阅按钮点击事件:
btn.Click += btn1_Click;
private void btn1_Click(object sender, RoutedEventArgs e)
{
// concatenate to the active window result view the button value here
}
【讨论】: