将事件GotFocus分配给WPF应用程序中的所有文本框

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

我想将GotFocus-Event添加到WPF应用程序中的每个文本框,因为它适用于触摸设备,并且每次使用TextBox时都应打开OSK。我在将事件添加到文本框的过程中遇到问题。 Aplication已经在pc上构建(我正在忙碌中,我的目标是将Apl。引入Windows 8 Touch Devices)。这是链接,我的灵感来自于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也是如此!

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

我看到的问题是,您使用的答案是Winforms applicationWpf application,在Winforms中,您的控件可以添加到主窗体中,因此this.Controls在Wpf中有效,您的[ C0]具有MainWindow属性,它只能包含一项,通常是某种ContentGridCanvas。此对象是您的Panel所在的位置。

注意:仅当您的文本框是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;
        }

    }

}

用法将是这样:

<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>

8
投票

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


0
投票

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


0
投票

将GotFocus处理程序添加到窗口中的根元素。假设您的根元素是一个网格,它将是

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