我想在我的WPF-Aplication中为每个Textbox添加GotFocus-Event,因为它适用于Touch Devices,每次使用TextBox时OSK都应该打开。我遇到了将事件添加到TextBoxes的过程的问题。应用程序已经为pc构建(我正在使用interhsip,我的目标是将这个应用程序带到Windows 8触摸设备)。这是链接,我得到了灵感: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一样!
答案 0 :(得分:8)
您可以做得更好,将以下代码添加到app.xaml.cs:
protected override void OnStartup(StartupEventArgs e)
{
EventManager.RegisterClassHandler(typeof(TextBox),
TextBox.GotKeyboardFocusEvent, new RoutedEventHandler(TextBox_GotFocus));
base.OnStartup(e);
}
答案 1 :(得分:0)
您可以使用带有文本框继承的用户控件轻松实现它。
public UserTextbox()
{
InitializeComponent();
this.GotFocus += (sender, args) =>
{
//your code here
};
}
此用户控件可以使用您想要的项目中的每个位置。
答案 2 :(得分:0)
将GotFocus处理程序添加到窗口中的根元素 假设你的根元素是一个Grid,它将是
<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();
}
}
答案 3 :(得分:0)
我发现问题在于您使用的是Winforms application
Wpf application
的答案,在Winforms中您的控件可以添加到主窗体中,因此{{1}在Wpf中,您的this.Controls
有一个MainWindow
属性,该属性只能包含一个项目,通常是某种Content
,Grid
或Canvas
。该对象是Panel
所在的位置。
注意:这只有在TextBox是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;
}
}
}
Usuage将是这样的:
<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>