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

问题描述 投票:1回答:4

我想将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也是一样的!

c# .net wpf error-handling controls
4个回答
0
投票

在我看来,问题在于你使用的答案是用于 Winforms application 附带 Wpf application在Winforms中,你的控件可以被添加到主窗体中,因此,你可以将其添加到主窗体中。this.Controls 工作,在WPF中,你的 MainWindow 拥有 Content 只能包含一个项目的属性,通常是一个。Grid, CanvasPanel 的某种。这个对象是你的 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;
        }
    }
}

8
投票

你可以做得更好,在app.xaml.cs中添加以下代码。

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

        base.OnStartup(e);
    }

0
投票

你可以很容易地使用带有文本框继承的用户控件来实现它。

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

            };
        }

这个用户控件你可以在你项目中任何你想要的地方使用。


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

        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.