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

标签 c# .net wpf error-handling controls

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

当我想运行此代码时,出现以下错误:

Error 1 'OSK_Test.MainWindow' does not contain a definition for 'Controls' and no extension method 'Controls' accepting a first argument of type 'OSK_Test.MainWindow' could be found (are you missing a using directive or an assembly reference?)



我该怎么办,才能奏效?当然,LostFocus也是如此!

最佳答案

我所看到的问题是,您使用的答案是带有Winforms applicationWpf application,在Winforms中可以将控件添加到主窗体中,因此this.Controls可以工作,在Wpf中,您的MainWindow具有Content属性,该属性只能包含一个项目,通常是某种GridCanvasPanel。该对象是您的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;
        }

    }

}

根据OP的评论:

您将需要给您的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;
        }
    }
}

关于c# - 将事件GotFocus分配给WPF应用程序中的所有文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19928232/

相关文章:

.net - 如果堆栈内存已满会发生什么

c# - XmlSerializer 可以池化字符串以避免大的重复字符串吗?

c# - Mvp View 了解模型

c# - 如何遍历列表并从中创建一个 json 数组?

.net - 将dll注入(inject)exe文件

wpf - 对于 WPF,哪个 MVVM 框架好?

c# - 当绑定(bind)对象的属性更改时,WPF Caliburn Micro CanExecute

c# - 从 C# 应用程序内部存储空整数值

c# - 如何解决服务层内部的循环依赖

c# - 在 View 中禁用复选框