代码之家  ›  专栏  ›  技术社区  ›  Jürgen Steinblock

如何检测带有自动省略号的system.windows.forms.label是否实际显示省略号?

  •  5
  • Jürgen Steinblock  · 技术社区  · 14 年前

    我有一个Windows窗体应用程序,在其中我在标签中显示一些客户机数据。 我已设置label.autoellipsis=true。
    如果文本比标签长,则如下所示:

    Some Text
    Some longe... // label.Text is actually "Some longer Text"
                  // Full text is displayed in a tooltip
    

    这就是我想要的。

    但现在我想知道标签是否在运行时使用了自动省略号功能。 我怎么做到的?

    解决方案

    多亏了Max。现在我可以创建一个控件,尝试将整个文本放在一行中。如果有人感兴趣,代码如下:

    Public Class AutosizeLabel
        Inherits System.Windows.Forms.Label
    
        Public Overrides Property Text() As String
            Get
                Return MyBase.Text
            End Get
            Set(ByVal value As String)
                MyBase.Text = value
    
                ResetFontToDefault()
                CheckFontsizeToBig()
            End Set
        End Property
    
        Public Overrides Property Font() As System.Drawing.Font
            Get
                Return MyBase.Font
            End Get
            Set(ByVal value As System.Drawing.Font)
                MyBase.Font = value
    
                currentFont = value
    
                CheckFontsizeToBig()
            End Set
        End Property
    
    
        Private currentFont As Font = Me.Font
        Private Sub CheckFontsizeToBig()
    
            If Me.PreferredWidth > Me.Width AndAlso Me.Font.SizeInPoints > 0.25! Then
                MyBase.Font = New Font(currentFont.FontFamily, Me.Font.SizeInPoints - 0.25!, currentFont.Style, currentFont.Unit)
                CheckFontsizeToBig()
            End If
    
        End Sub
    
        Private Sub ResetFontToDefault()
            MyBase.Font = currentFont
        End Sub
    
    End Class
    

    可能需要一些微调(使用设计器可见属性配置步骤大小和最小值),但目前它工作得很好。

    2 回复  |  直到 7 年前
        1
  •  14
  •   max    14 年前
    private static bool IsShowingEllipsis(Label label)
    {
        return label.PreferredWidth > label.Width;
    }
    
        2
  •  2
  •   Vasily Ivanov    7 年前

    实际上,你的标签可以是多行的。在这种情况下,label.preferredwidth没有帮助。但你可以使用:

        internal static bool IsElipsisShown(this Label @this)
        {
            Size sz = TextRenderer.MeasureText(@this.Text, @this.Font, @this.Size, TextFormatFlags.WordBreak);
            return (sz.Width > @this.Size.Width || sz.Height > @this.Size.Height);
        }