Как плавно перемещать текст метки с помощью таймера? - PullRequest
0 голосов
/ 03 июля 2018

В приложении C # WinForm у меня есть элемент управления Label, и я хочу переместить его текст справа налево, когда текст не соответствует размеру.

Я заставил мой текст скользить справа налево, используя Timer, но он не двигается плавно, потому что я думаю, что ширина каждого алфавита отличается (например, ширина i намного меньше, чем w, и т. Д. .) Это выглядит очень плохо, и я прикрепил gif ниже, чтобы вы увидели. Там написано Почему этот текст не будет плавно двигаться? Как видите, его очень трудно читать, потому что он иногда сильно, а иногда немного.

Why won't this text move smoothly?

Ширина и высота элемента управления Label фиксированы и не подлежат изменению.

Вот мой код:

 /* Timer event to move the text from right to left. */
 /* The name of the Label control is myLabel. */
 private void MoveLabelText_Tick(object sender, EventArgs e)
 {
     this.myLabel.Text = this.myLabel.Text.Substring(1, this.myLabel.Text.Length - 1) + this.myLabel.Text.Substring(0, 1);
 }

Может кто-нибудь дать мне совет, что я могу сделать, чтобы это исправить? Или есть ли другой способ, кроме использования таймера, если это проще?

1 Ответ

0 голосов
/ 03 июля 2018

Вместо этого я бы порекомендовал вам не редактировать текст. Вместо этого используйте метку с постоянным текстом, и она должна быть внутри объекта Panel. Затем переместите положение метки так, чтобы определенные части метки были видны на панели. Я думаю, вы получите лучший опыт. Вы будете изменять левую координату вместо текста. Ярлык будет шире, чем панель.

Исходный код для дизайнера

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
    Inherits System.Windows.Forms.Form

    'Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.components = New System.ComponentModel.Container()
        Me.Panel1 = New System.Windows.Forms.Panel()
        Me.Label1 = New System.Windows.Forms.Label()
        Me.Timer1 = New System.Windows.Forms.Timer(Me.components)
        Me.Panel1.SuspendLayout()
        Me.SuspendLayout()
        '
        'Panel1
        '
        Me.Panel1.Controls.Add(Me.Label1)
        Me.Panel1.Location = New System.Drawing.Point(279, 90)
        Me.Panel1.Name = "Panel1"
        Me.Panel1.Size = New System.Drawing.Size(200, 100)
        Me.Panel1.TabIndex = 0
        '
        'Label1
        '
        Me.Label1.AutoSize = True
        Me.Label1.Location = New System.Drawing.Point(177, 35)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(291, 13)
        Me.Label1.TabIndex = 0
        Me.Label1.Text = "rewrewtewerewrewtjoitjrewoirewjtewotjweotirjewotijwertjewirtj"
        '
        'Timer1
        '
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(800, 450)
        Me.Controls.Add(Me.Panel1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.Panel1.ResumeLayout(False)
        Me.Panel1.PerformLayout()
        Me.ResumeLayout(False)

    End Sub

    Friend WithEvents Panel1 As Panel
    Friend WithEvents Label1 As Label
    Friend WithEvents Timer1 As Timer
End Class

Исходный код для файла VB

Public Class Form1
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Label1.Location = New Point(Label1.Location.X - 1, Label1.Location.Y)
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Timer1.Start()
    End Sub
End Class

Изображение этикетки, начинающейся справа и преднамеренно обрезанной Picture of the Label Starting To Right and Intentionally Cut Off

...