我想使用C#System.Windows.Forms.SendKeys.SendWait()
方法将OntrcreenKeyboard上的击键发送到文本框。由于我也可以在其他地方使用这个OnScreenKeyboard,我在一个额外的项目中创建了一个带有View(用于键盘设计)和Viewmodel(基本上用于调用Sendkeys.SendWait()
方法)的UserControl。
在这个项目中,我创建了一个MainView,我通过ContentControl包含了UserControl,如下面的代码所示。 CurrentPage
基本上是指键盘的Viewmodel。
<Window.Resources>
<DataTemplate DataType="{x:Type viewModel:KeyboardViewmodel}">
<view:KeyboardView/>
</DataTemplate>
</Window.Resources>
<Grid>
<Border Background="White">
<HeaderedContentControl Content="{Binding Path=CurrentPage}"/>
</Border>
<TextBox Width="120"/>
</Grid>
我现在在我的窗口中有OnScreenKeyboard和一个文本框。单击文本框并按我的OnScreenKeyboard按钮将导致文本出现在我的文本框中。 KeyboardView中的所有控件都设置为避免聚焦。这对于保持对文本框的关注是必要的。
KeyboardView中的按钮全部绑定到我的KeyboardViewmodel中的Command ClickCommand
。这是KeyboardViewmodel的代码:
public class KeyboardViewmodel : BaseModel
{
public BaseCommand ClickCommand { get; set; }
public KeyboardViewmodel()
{
ClickCommand = new BaseCommand(PressAndRelease);
}
public void PressAndRelease(object key)
{
if (((string)key).Length <= 1)
SendKeys.SendWait((string)key);
else
SendKeys.SendWait("{" + (string)key + "}");
}
}
现在我用这些文件创建了一个NuGet包,并将它们导入到我想要使用OnScreenKeyboard的项目中。
我做的基本上与之前测试OnScreenKeyboard时的做法基本相同。
但是让我更多地解释项目的结构:
我有MainView
+ MainViewmodel
。 MainViewmodel
管理可用页面之间的导航。为了显示这些页面 - 我在之前的简短示例中 - 一个ContentControl
,其内容绑定到CurrentPage
属性。 MainView
为正常Window
,其他所有观看均为UserControls
。
在其中一个页面中,我需要一个OnScreenKeyboard(DetailsView + DetailsViewmodel)。因此,在DetailsView中使用另一个ContentControl
似乎合乎逻辑:
<Border Grid.Column="0" Grid.Row="4" Grid.ColumnSpan="3" Height="Auto" Width="Auto">
<ContentControl Content="{Binding Path=OnScreenKeyboard}"/>
</Border>
我在KeyboardViewmodel
的构造函数中创建了DetailsViewmodel
。 DetailsViewmodel
的构造函数在启动时在MainViewmodel
中调用。
所以到目前为止一切正常,OnScreenKeyboard显示在正确位置的正确页面上。如果单击OnScreenKeyboard的按钮,则会调用正确的绑定命令并调用SendKeys.SendWait()
方法。
但TextBox中没有文字出现。我对SendKeys.SendAwait()方法的理解非常糟糕。此外,MSDN文档似乎在这个主题上并不是非常详尽。
它声明:“将给定的密钥发送到活动的应用程序,然后等待处理的消息。”
现在。主动/聚焦应用程序是我的应用程序。所以我的猜测是我的文本框应该处理KeyStrokes。
我的问题:
更新 正如评论中指出的那样,这可能是一个重复的问题。 我很清楚各种不同的解决方案,并且已经考虑过了:
但是,正如人们可能理解的那样,这些项目对我的简单需求来说太过强大了。
这是一个截图,可以更好地了解我的需求:
真的很简单。 4行按钮永远不会改变,除了将按下按钮的CommandParameter
发送到文本框/活动表格之外没有其他控件/功能。
对这个具体问题的研究没有表现出任何类似的问题。在大多数其他SO问题中,问题是将数据发送到另一个窗口,而不是在当前窗口中发送数据。 所以我不认为这个问题是重复的。