将事件GotFocus分配给WPF-Application中的所有TextBox

时间:2013-11-12 11:43:02

标签: c# .net wpf error-handling controls

我想在我的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一样!

4 个答案:

答案 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属性,该属性只能包含一个项目,通常是某种ContentGridCanvas。该对象是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>