【问题标题】:How to make a label scroll a word back and forth?如何让标签来回滚动一个单词?
【发布时间】:2012-02-12 08:38:53
【问题描述】:

我想出了让标签将单词滚动到一侧然后更改单词并滚动回另一侧的想法

   "ping           "
   " ping          "
   "  ping         "
   "   ping        "
   "    ping       "
   "     ping      "
   "      ping     "
   "       ping    "
   "        ping   "
   "         ping  "
   "          ping "
   "           ping"
   "           pong"
   "          pong "
   "         pong  "
   "        pong   "
   "       pong    "
   "      pong     "
   "     pong      "
   "    pong       "
   "   pong        "
   "  pong         "
   " pong          "
   "pong           "

我希望它只在一个恒定循环中执行 ^^,但我什至不知道如何开始这样做,如果有人可以帮助我,我将非常感激。文本的最大长度必须为 15 个字符。

我不在乎它是否平滑滚动。

我希望它是一个 Winforms 应用程序并使用 .Net framework 4.0。

【问题讨论】:

  • 这是winforms项目还是控制台项目?
  • 在 Windows 窗体应用程序中,您可以使用 Timer 组件,在 WPF /SilverLight 应用程序中,您可以使用动画,在 Web 应用程序中,您可以使用 javascript。请描述您正在寻找哪个目标的答案(以及框架版本)。
  • 我想使用一个计时器,然后流式传输该文本,使其看起来像是从每一侧和框架 4.0 反弹
  • Here's 一个原始示例,应该很容易根据您的需要进行修改。
  • 这个问题有必要问两次吗?

标签: c# winforms scroll marquee


【解决方案1】:

这就是我要做的,当我测试它时它似乎工作得很好,我创建了一个带有计时器和标签的 Windows 窗体。确保在打开表单时调用 timer.Start(),它将开始在屏幕上弹跳。如果将 iUBound 更改为更大的值,它将在屏幕上移动更多的空间。

    string _sPing = "ping";
    string _sPong = "pong";
    bool bGoingUp = true;
    int iUBound = 15;
    int iCnt = 1;

    public Form1()
    {
        InitializeComponent();
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {

        if (bGoingUp)
        {
            label1.Text = " " + label1.Text;
            iCnt++;
        }
        else
        {
            label1.Text = label1.Text.Substring(1,label1.Text.Length - 1);
            iCnt--;
        }

        if (iCnt == iUBound)
        {
            bGoingUp = false;
            label1.Text = label1.Text.Replace(_sPing, _sPong);
        }
        else if (iCnt == 1)
        {
            bGoingUp = true;
            label1.Text = label1.Text.Replace(_sPong, _sPing);
        }

   }

【讨论】:

    【解决方案2】:

    我会保持标签内容不变,只是移动标签,感觉应该会减少 CPU 负载,滚动会更流畅。

    【讨论】:

      【解决方案3】:

      创建一个从 0 到 11 的 for 循环(15 - “ping”的长度)。使用new String(' ', i),您可以创建一个长度为i 空格的字符串。然后将标签的 Text 设置为与单词“ping”连接的这个空格字符串。

      现在您可以创建另一个循环,从 11 运行到 0,但使用“pong”一词。

      如果您将两个循环都包含在一个无限循环 (while (true) { ... }) 中,这将无限期地运行。

      您可能还想在每次使用Thread.Sleep(200) 设置标签文本后添加一个暂停。您指定的时间以毫秒为单位。


      编辑(因为它不是家庭作业):

      转到属性窗口中的事件选项卡并添加Shown 事件处理程序

      private void frmMarquee_Shown(object sender, EventArgs e)
      {
          while (true) {
              for (int i = 0; i <= 11; i++) {
                  label1.Text = new String(' ', i) + "ping";
                  System.Threading.Thread.Sleep(100);
                  Application.DoEvents();
              }
              for (int i = 11; i >= 0; i--) {
                  label1.Text = new String(' ', i) + "pong";
                  System.Threading.Thread.Sleep(100);
                  Application.DoEvents();
              }
          }
      }
      

      请注意,此解决方案并不完美,因为表单无法正常关闭。您将不得不中止程序。使用计时器的解决方案会更顺畅,并且表单在关闭时会按预期运行,但这是一个简单明了的解决方案。

      【讨论】:

      • TYVM!如果我能弄清楚如何写你所说的话,我现在一直在努力解决这个问题:/ lol
      • 这对我来说就像是作业。你真的要我们做你所有的功课吗?见for loopconcatenate stringswhile loop
      • 这不是家庭作业,我正在尝试为我的利益编写程序
      • 我看到最近发布的 4 或 5 个问题都在问基本相同的问题。这让我想到了它的功课。
      • 似乎也没有选择作为其他问题的答案。
      【解决方案4】:

      我找到了this example。非常接近你想要的。两个关键元素是 (1) 使用 StringBuilder 函数来附加字符和 (2) 异步委托将动画放在不同的线程中。

      StringBuilder 的想法很棒,因为它应该比处理String 更有效率。我喜欢Asynchronous delegate,因为它听起来比Timer 更令人印象深刻

      【讨论】:

      • 在处理 UI 时执行多线程应用程序可能会变得棘手。代表很棒,但对于伊恩所说的复杂性,这可能有点矫枉过正
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2016-10-16
      相关资源
      最近更新 更多