vb.net - Windows 窗体 : Unable to Click to Focus a MaskedTextBox in a Non TopLevel Form

标签 vb.net winforms parent-child maskedtextbox

如标题所示,我显示了一个子窗体,其 TopLevel 属性设置为 False,并且我无法单击它包含的 MaskedTextBox 控件(以便将焦点集中到它)。不过,我可以通过使用键盘上的 TAB 来将焦点集中到它上。

子窗体包含其他常规文本框控件,我可以毫无问题地单击这些控件来聚焦,尽管它们也表现出一些奇怪的行为:例如,如果我在文本框中有一个值,并且我尝试从从字符串末尾到开头,什么也没有发生。事实上,我根本无法使用鼠标在 TextBox 的文本内移动光标(尽管键盘箭头键可以工作)。

我不太担心奇怪的 TextBox 行为,但为什么我不能通过单击来激活我的 MaskedTextBox?

下面是显示表单的代码:

Dim newReportForm As New Form
Dim formName As String
Dim FullTypeName As String
Dim FormInstanceType As Type

formName = TreeView1.SelectedNode.Name

FullTypeName = Application.ProductName & "." & formName

FormInstanceType = Type.GetType(FullTypeName, True, True)

newReportForm = CType(Activator.CreateInstance(FormInstanceType), Form)
Try
   newReportForm.Top = CType(SplitContainer1.Panel2.Controls(0), Form).Top + 25
   newReportForm.Left = CType(SplitContainer1.Panel2.Controls(0), Form).Left + 25
Catch
End Try
newReportForm.TopLevel = False
newReportForm.Parent = SplitContainer1.Panel2
newReportForm.BringToFront()                
newReportForm.Show()

最佳答案

我尝试了你的代码,这次得到了很好的重现。正如我在原来的帖子中提到的,这确实是一个窗口激活问题。您可以在 Spy++ 中看到这一点,注意 WM_MOUSEACTIVATE 消息。

发生这种情况是因为您显示带有标题栏的表单。这使 Windows 窗口管理器相信该窗口可以被激活。这实际上不起作用,它不再是顶级窗口。从标题栏可以看出,它永远不会用“窗口激活”颜色绘制。

您必须从表单中删除标题栏。最好通过将此行添加到您的代码中来完成:

    newReportForm.FormBorderStyle = Windows.Forms.FormBorderStyle.None

这会将表单变成一个与 UserControl 无法区分的控件。您仍然可以通过使用以下代码来使其与众不同:

    newReportForm.ControlBox = False
    newReportForm.Text = ""

任一修复都可以解决鼠标点击问题。

关于vb.net - Windows 窗体 : Unable to Click to Focus a MaskedTextBox in a Non TopLevel Form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2875075/

相关文章:

vb.net - 如果应用程序框架被禁用,将 VB.Net 托盘应用程序设置为单实例?

.net - 合并 GUI 更改

.net - 有关第三方编辑/语法突出显示控件的建议-WinForms

ios - 如何在打开时将数据从父 View 传递给 subview ?

php - mysql如何获取表的外键

asp.net - Google map 上的多个标记

html - 在浏览器中显示 HTML 电子邮件正文之前确保安全

html - 悬停元素,在父元素 sibling child 上显示悬停效果

vb.net - 哪个更快? ByVal 还是 ByRef?

c# - 方法不返回值