WPF TextBox不接受输入,空间和退格工作

时间:2010-11-12 10:12:17

标签: c# wpf

我在usercontrol中有文本框,我使用以下XAML将usercontrol添加到MainWindow:

 <Views:MyUserControl />

我在MyUserControl中有一个TextBox,问题是TextBox不接受任何输入。退格键och空间有效,但是如果按下字母,则不会在TextBox中添加任何文本。

我确保文本不仅隐藏在TextBox中。 我也尝试将RichTextBox添加到MyUserControl,结果相同,它不会接受任何输入(在空格och退格旁边)。

我还尝试将一个TextBox添加到MainWindow,结果相同;它没有任何输入(在空格旁边退格)。

MySuserControl也添加在TabControl和TabItem中。

任何线索?

编辑:其他信息 忘了写我正在从WinForm应用程序打开/创建WPF窗口。 当我在VS10中将我的启动项目设置为我的WPF项目时,它可以很好地使用TextBox的键盘输入。

怎么回事?

使用以下代码打开/创建我的WPF窗口:

MyWpfProject.MainWindow mw = new MyWpfProject.MainWindow();
mw.Show();

编辑:解决方案 所以我想我真正的问题是从WinForms应用程序打开WPf项目。

我添加了以下代码:

MyWpfProject.MainWindow mw = new MyWpfProject.MainWindow();
ElementHost.EnableModelessKeyboardInterop(mw);
mw.Show();

“如果从非WPF主机(如WinForms)加载,则需要在WPF窗口中处理键盘输入。”EnableModelessKeyboardInterop()调用是必需的。“ http://weblogs.asp.net/jdanforth/archive/2008/07/29/open-a-wpf-window-from-winforms.aspx

4 个答案:

答案 0 :(得分:41)

回答我自己的问题(如果其他人遇到同样的问题): 如果从WinForms应用程序打开WPF表单,则必须执行以下操作才能获得键盘输入:

MyWpfProject.MainWindow mw = new MyWpfProject.MainWindow();
ElementHost.EnableModelessKeyboardInterop(mw);
mw.Show();

“如果从非WPF主机(如WinForms)加载,则需要在WPF窗口中处理键盘输入。”EnableModelessKeyboardInterop()调用是必需的。“ http://weblogs.asp.net/jdanforth/archive/2008/07/29/open-a-wpf-window-from-winforms.aspx

答案 1 :(得分:1)

也许您的用户控件正在获取键盘事件而不是文本框?尝试以这种方式搜索,它发生在鼠标按钮上。

答案 2 :(得分:1)

我遇到了同样的问题,但我的环境已经建成,因此我无法应用上述解决方案。事实证明这不是问题所在。它比预期的要容易得多。

我在WinForms中托管了一个WPF用户控件。我的WinForms MainView(启动表单)确实覆盖了&#34; ProcessCmdKey&#34;。由于逻辑错误,它什么也没有返回。

尽管如此,我在XAML文件中收到了代码中的所有关键事件,但这些事件从未更新过&#34; Text&#34;我的文本框。只有空间和后退才这样做,这是我在后面的代码中没有收到的关键事件。

所以,如果您没有想到这里最简单的解决方案,那就是VB.NET。

STRG + F&#34; ProcessCmdKey&#34;并确保您返回正确的值可能会完全取消注释,只是为了验证它不会给您带来与我相同的麻烦。

答案 3 :(得分:0)

我想在偶然的机会上添加我自己的答案,它可以帮助遇到相同或相似问题的其他任何人。我的特殊用例是外接程序创建的.Net Windows窗体。外接程序用完了Autodesk Inventor,我认为它可能是WPF(但请不要相信。)外接程序具有几个停靠在应用程序中的窗口形式,其中一些充当弹出窗口或单独的辅助窗口。解决方案是将Windows窗体所有者设置为停靠的窗体之一。这样做可以编辑文本并将其输入到其文本框中。一个非常小众的解决方案,可以解决小众问题,但希望它可以在将来的某个时候对某人有所帮助。

private void CreatePanels(DockableWindows DockableWindows)
{
    //Create the dockable window that the panel form will live on. 

    DockableWindow SideWindow = 

        DockableWindows.Add(SidePanelNames.GUID, SidePanelNames.InternalWindowName, SidePanelNames.Title);

    //Configure the windows settings. 

    SideWindow.ShowTitleBar = true;

    SideWindow.ShowVisibilityCheckBox = true;

    SideWindow.DisableCloseButton = false; 

    SideWindow.Visible = true;

    SideWindow.AddChild(SidePanel.Handle); //Add the forms as children and then display to the user. 

    SidePanel.Show(); //Display the panel to the user. 
}

/// <summary>
/// Creates the Display window were order and patient information is displayed to the user. 
/// This method makes the adjust device form the owner of the display window. Because of this
/// dependecency it should be run after the panels have been created. 
/// </summary>
private void CreateDisplayWindow()
{
    DisplayForm = new DisplayForm //Create the display form. 
    {
        Owner = SidePanel //Doing this allows text boxes to have values entered into them. 
    };

    DisplayForm.Show(); //Show the display form to the user. 
}

///将侧面面板添加为显示表单的所有者实际上是我需要进行的唯一更改。

对于尝试此解决方案的任何人,我都会加一些警告。简单地说,我从那以后发现那不是很好。它可以防止表单或其任何控件检测某些按键(输入和选项卡),这对我的使用非常重要。您将在https://forums.autodesk.com/t5/inventor-forum/dockable-window-with-wpf-controls-don-t-receive-keyboard-input/td-p/9115997

处找到更好的解决方案