我想将GotFocus-Event添加到我的WPF应用程序中的每个TextBox中,因为它是用于触摸设备的,每次TextBox使用时OSK都应该打开。我在向我的TextBoxes添加事件的过程中遇到了问题。这个应用程序已经在PC上建立了(我正在进行一个交互,我的目标是把这个应用程序带到Windows 8触摸设备上)。这就是我的灵感来源的链接。为文本框添加删除处理程序
这是我的解决方案。
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'不包含'Controls'的定义,也没有找到接受第一个参数类型为'OSK_Test.MainWindow'的扩展方法'Controls'(你是否缺少一个使用指令或汇编参考?
我应该怎么做,才能让它工作?当然,LostFocus也是一样的!
在我看来,问题在于你使用的答案是用于 Winforms application
附带 Wpf application
在Winforms中,你的控件可以被添加到主窗体中,因此,你可以将其添加到主窗体中。this.Controls
工作,在WPF中,你的 MainWindow
拥有 Content
只能包含一个项目的属性,通常是一个。Grid
, Canvas
或 Panel
的某种。这个对象是你的 TextBox's
的位置。
注意:只有当你的TextBox's是MainWindows LayoutControl的子代,而不是嵌入更深的地方时,这才会有效。 这只适用于TextBox's是MainWindows LayoutControl的子代,而不是嵌入更深的地方,如果嵌入更深的地方,你将需要命名它们所包含的面板,并通过该面板进行迭代。我也不是说这是解决你问题的正确方法,只是想指出你的问题是什么。:
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;
}
}
}
根据上级的评论,你需要给你的StackPpanel取一个名字,或者使用一个现有的名字(如果有的话)。
你需要给你的StackPpanel取一个名字,或者使用一个现有的名字,如果有的话。
<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>
通常情况下会是这样的。
public MainWindow()
{
InitializeComponent();
foreach (Control tb in MyStackPanel.Children)
{
if (tb is TextBox)
{
TextBox tb1 = (TextBox)tb;
tb1.GotFocus += TextBox_GotFocus;
tb1.LostFocus += tb1_LostFocus;
}
}
}
你可以做得更好,在app.xaml.cs中添加以下代码。
protected override void OnStartup(StartupEventArgs e)
{
EventManager.RegisterClassHandler(typeof(TextBox),
TextBox.GotKeyboardFocusEvent, new RoutedEventHandler(TextBox_GotFocus));
base.OnStartup(e);
}
你可以很容易地使用带有文本框继承的用户控件来实现它。
public UserTextbox()
{
InitializeComponent();
this.GotFocus += (sender, args) =>
{
//your code here
};
}
这个用户控件你可以在你项目中任何你想要的地方使用。
在你的窗口中为你的根元素添加一个GotFocus处理程序。假设你的根元素是一个网格,那么它将是
<Grid name="root" GotFocus="root_GotFocus">
在您的代码中
private void root_GotFocus(object sender, RoutedEventArgs e)
{
TextBox tb = e.OriginalSource as TextBox;
if(tb != null)
{
//do your thing
KeyBoardManager.LaunchOnScreenKeyboard();
}
}