1

我想将 GotFocus-Event 添加到我的 WPF 应用程序中的每个文本框,因为它用于触摸设备并且每次使用文本框时都应该打开 OSK。我在将事件添加到我的文本框时遇到问题。该应用程序已经为 pc 构建(我在一个 interhsip 中,我的目标是将这个 Apl. 带到 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”不包含“控件”的定义,并且找不到接受“OSK_Test.MainWindow”类型的第一个参数的扩展方法“控件”(您是否缺少 using 指令或程序集引用?)

我该怎么办,它有效吗?当然,LostFocus 也是如此!

4

4 回答 4

8

您可以做得更好,将以下代码添加到 app.xaml.cs:

protected override void OnStartup(StartupEventArgs e)
    {
        EventManager.RegisterClassHandler(typeof(TextBox),
            TextBox.GotKeyboardFocusEvent, new RoutedEventHandler(TextBox_GotFocus));

        base.OnStartup(e);
    }
于 2013-12-23T10:36:30.340 回答
0

我看到的问题是您使用的答案是 aWinforms application和 a Wpf application,在 Winforms 中,您的控件可以添加到主窗体中,因此this.Controls可以工作,在 Wpf 中,您MainWindow有一个Content只能包含一个项目的属性,通常是GridCanvasPanel某种。该对象是您所在TextBox's的位置。

注意:这仅在您的 TextBox 是 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;
        }

    }

}

根据OP的评论:

您需要为您的 StackPpanel 命名,或者使用现有的(如果存在)。IE

<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;
        }
    }
}
于 2013-11-14T03:22:02.147 回答
0

将 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();

        }
    }
于 2013-11-13T23:06:48.063 回答
0

您可以使用带有文本框继承的用户控件轻松实现它。

 public UserTextbox()
        {
            InitializeComponent();
            this.GotFocus += (sender, args) => 
            {
                //your code here

            };
        }

您可以在项目中的任何位置使用此用户控件。

于 2013-11-12T11:46:34.847 回答