为用户控件中的项目/控件设置工具提示

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

我尝试为我创建的自定义

UserControl
设置工具提示。

UserControl
包含一个文本框和周围的画布区域。这样做的原因是为了产生带有附加标签的垂直居中
TextBox
的错觉。标签是通过
TextRenderer.DrawText
创建的,因此当将鼠标悬停在标题文本上时,工具提示会起作用,因为在这种情况下我实际上是悬停在
UserControl
画布上。

渲染后是这样的:

正如预期的那样,工具提示(在包含的窗体上分配)仅在鼠标指针位于 UserControl 上时显示,而不是在 UserControl 中的 TextBox 上时显示。

这是设计者生成的包含表单的代码:

' 
' usrCtrlTxtBox
' 
usrCtrlTxtBox.BackColor = SystemColors.Window
usrCtrlTxtBox.BorderStyle = BorderStyle.FixedSingle
resources.ApplyResources(usrCtrlTxtBox, "usrCtrlTxtBox")
usrCtrlTxtBox.Name = "usrCtrlTxtBox"
ToolTip1.SetToolTip(usrCtrlTxtBox, resources.GetString("usrCtrlTxtBox.ToolTip"))

我现在想将相同的工具提示文本分配给用户控件内包含的文本框。为此,我需要以某种方式访问

UserControl
本身的工具提示集。浏览.Net源代码后,我发现 Tooltip1.SetTooltip 命令最终调用了一个名为
SetToolTipToControl
的方法(Tooltip.cs 中的第 1280 到 1286 行),该方法最终调用了这个方法(Control.cs 中的第 10941 到 10944 行):

internal virtual void SetToolTip(ToolTip toolTip)
{
    // Control doesn't have a specific logic after a toolTip is set
}

所以我认为在我的

UserControl
中使用自定义 Sub 覆盖此方法是个好主意:

Protected Overrides Sub SetToolTip(outerTooltip As ToolTip)
    ToolTipInner.SetToolTip(txtBox, outerTooltip.GetToolTip(Me))
    'txtBox is the inner TextBox of the UserControl
    'TooltipInner is a ToolTip-Control inside the UserControl
End Sub

遗憾的是,这并没有像编译器抱怨的那样按计划工作:

BC31417
'Protected Overrides Sub SetToolTip(outerTooltip As ToolTip)' cannot override 'Friend Overridable Overloads Sub SetToolTip(toolTip As ToolTip)' because it is not accessible in this context.

我对 C# 不太熟悉,但我认为我能够重写内部虚拟方法,因为如果我没有记错的话,

UserControl
最终会继承自
Control
。我在这里没有想法,希望得到任何帮助。是否有可能从控件本身内部访问用户控件工具提示?

编辑/添加:

由于 UserControl 将在许多不同的表单上使用,并具有许多不同的可能标题和工具提示文本,因此这些字符串不是静态的,而是由 UserControl 的包含表单设置。由于需要翻译这些文本,我对每个表单使用 RESX 文件,其中设置到 UserControl 的每个实例的文本在表单的 InitializeComponent 阶段进行翻译。

总结:

我尝试从

SetToolTip
内部覆盖
UserControl
方法以访问用户控件的外部工具提示。我想避免像
Reflection
这样的结构和像
Me.FindForm().Controls.Find("ToolTip1")
这样的恶作剧。

vb.net winforms inheritance user-controls .net-8.0
1个回答
0
投票

解决方案1:

在您的

Sub
中创建以下
UserControl

Friend Sub SetToolTipInnerControls(caption As String)
    ToolTipInner.SetToolTip(txtBox, caption)
    ' Add all inner controls you want to have the same tooltip or loop through the Controls collection.
End Sub

创建自定义组件,继承内置的

ToolTip
组件:

Namespace Controls
    Public Class ToolTip
        Inherits System.Windows.Forms.ToolTip

        Public Overloads Sub SetToolTip(ctrl As Control, caption As String)
            MyBase.SetToolTip(ctrl, caption)

            If TypeOf ctrl Is CtrlTxtBox Then
                DirectCast(ctrl, CtrlTxtBox).SetToolTipInnerControls(caption)
            End If
            ' If you have multiple different UserControls which need this behavior, you could also check against the common type they derive from.
        End Sub
    End Class
End Namespace

在表单上使用此自定义

ToolTip
,而不是常规
ToolTip
组件。

设计器将在为您的控件分配工具提示时为您创建常用代码:

ToolTipOnForm.SetToolTip(usrCtrlTxtBox, resources.GetString("usrCtrlTxtBox.ToolTip"))

这将调用覆盖的

Sub
,然后将调用您的
Sub
上的
UserControl

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