我想将GotFocus-Event添加到WPF应用程序中的每个文本框,因为它适用于触摸设备,并且每次使用TextBox时都应打开OSK。我在将事件添加到文本框的过程中遇到问题。 Aplication已经在pc上构建(我正在忙碌中,我的目标是将Apl。引入Windows 8 Touch Devices)。这是链接,我的灵感来自于Add/Remove handler to textbox
这是我的解决方案:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
foreach (Control tb in this.Controls)
{
if (tb is TextBox)
{
TextBox tb1 = (TextBox)tb;
tb1.GotFocus += TextBox_GotFocus;
}
}
}
private void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
KeyBoardManager.LaunchOnScreenKeyboard();
}
当我想运行此代码时,出现以下错误:
错误1'OSK_Test.MainWindow'不包含针对'控件',并且没有扩展方法'控件'接受第一个可以找到类型为'OSK_Test.MainWindow'的参数(是否丢失了using指令或程序集引用?)
我该怎么办,它有效吗?当然,LostFocus也是如此!
我看到的问题是,您使用的答案是Winforms application
和Wpf application
,在Winforms中,您的控件可以添加到主窗体中,因此this.Controls
在Wpf中有效,您的[ C0]具有MainWindow
属性,它只能包含一项,通常是某种Content
,Grid
或Canvas
。此对象是您的Panel
所在的位置。
注意:仅当您的文本框是MainWindows LayoutControl的子级,而不是更深层地嵌入时,此方法才有效。如果将其深层嵌入,则需要命名它们所包含的Panel并进行迭代,我也不建议这是解决您的问题的正确方法,只是试图指出您的问题是什么]] ::
TextBox's
基于OP的评论:
您需要给您的StackPpanel命名,如果存在,请使用现有名称。即
private void Grid_Loaded(object sender, RoutedEventArgs e) { foreach (Control tb in ((Panel)this.Content).Children) { if (tb is TextBox) { TextBox tb1 = (TextBox)tb; tb1.GotFocus += TextBox_GotFocus; tb1.LostFocus += tb1_LostFocus; } } }
用法将是这样:
<StackPanel x:Name="MyStackPanel" HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100">
<TextBox Height="23" TextWrapping="Wrap" Text="TextBox"/>
<TextBox Height="23" TextWrapping="Wrap" Text="TextBox"/>
<TextBox Height="23" TextWrapping="Wrap" Text="TextBox"/>
<TextBox Height="23" TextWrapping="Wrap" Text="TextBox"/>
<TextBox Height="23" TextWrapping="Wrap" Text="TextBox"/>
</StackPanel>
您可以做得更好,将以下代码添加到app.xaml.cs:
您可以使用具有文本框继承功能的用户控件轻松实现它。
将GotFocus处理程序添加到窗口中的根元素。假设您的根元素是一个网格,它将是