#winforms
#winforms
Вопрос:
Как показано на рисунке, текст со списком в моем случае очень длинный.
Существует ли какой-либо способ отображения полного текста при наведении на него курсора мыши без изменения ширины поля со списком?
Ответ №1:
Существует ли какой-либо способ отображения полного текста при наведении на него курсора мыши без изменения ширины поля со списком?
Вы можете использовать ToolTip
компонент для отображения элементов с длинным текстом при наведении указателя мыши на элемент управления. Всякий SelectedIndex
раз, когда происходят изменения, измеряйте выбранный элемент с помощью TextRenderer.MeasureText
метода, и если ширина строки больше, чем ширина окна редактирования, установите длинную строку в качестве всплывающей подсказки для элемента управления.
Примечание: ширина EditBox
= со списком.Ширина — ButtonWidth. Вы можете получить ButtonWidth из SystemInformation.VerticalScrollBarWidth
свойства.
Чтобы применить эту функцию, давайте создадим небольшой класс и унаследуем элемент ComboBox
управления.
C#
//
// using System.ComponentModel;
[DesignerCategory("Code")]
public class ComboBoxEx : ComboBox
{
private readonly ToolTip ttp;
public ComboBoxEx() : base() => ttp = new ToolTip();
private bool _showItemToolTip = true;
[DefaultValue(true)]
public bool ShowItemToolTip
{
get => _showItemToolTip;
set
{
if (_showItemToolTip != value)
{
_showItemToolTip = value;
ttp.SetToolTip(this, string.Empty);
}
}
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
base.OnSelectedIndexChanged(e);
if (ShowItemToolTip)
{
string str = string.Empty;
if (SelectedIndex >= 0)
{
var sz = TextRenderer.MeasureText(Text, Font);
if (sz.Width > Width - SystemInformation.VerticalScrollBarWidth)
str = Text;
}
ttp.SetToolTip(this, str);
}
}
protected override void Dispose(bool disposing)
{
if (disposing) ttp.Dispose();
base.Dispose(disposing);
}
}
VB.Net
'
' Imports System.ComponentModel
<DesignerCategory("Code")>
Public Class ComboBoxEx
Inherits ComboBox
Private ReadOnly ttp As ToolTip
Sub New()
MyBase.New
ttp = New ToolTip()
End Sub
Private _showItemToolTip As Boolean = True
<DefaultValue(True)>
Public Property ShowItemToolTip As Boolean
Get
Return _showItemToolTip
End Get
Set(value As Boolean)
If (_showItemToolTip <> value) Then
_showItemToolTip = value
ttp.SetToolTip(Me, String.Empty)
End If
End Set
End Property
Protected Overrides Sub OnSelectedIndexChanged(e As EventArgs)
MyBase.OnSelectedIndexChanged(e)
If ShowItemToolTip Then
Dim str = ""
If SelectedIndex >= 0 Then
Dim sz = TextRenderer.MeasureText(Text, Font)
If sz.Width > Width - SystemInformation.VerticalScrollBarWidth Then
str = Text
End If
End If
ttp.SetToolTip(Me, str)
End If
End Sub
Protected Overrides Sub Dispose(disposing As Boolean)
If disposing Then ttp.Dispose()
MyBase.Dispose(disposing)
End Sub
End Class
Вы можете использовать тот же подход, если не хотите создавать подклассы. Удалите ToolTip
компонент и обработайте ComboBox.SelectedIndexChanged
событие, как показано выше.