1

有没有办法(暂时)阻止用户通过拖动滑块来更改 TrackBar 的值?我发现的唯一方法是将Enabled属性设置为 false,但它也会使轨迹栏变灰。

编辑: 由于我得到了更多关于为什么不应该这样做而不是如何去做的答案,所以我决定解释为什么我想这样做。

我不是用它来允许用户调整某些应用程序属性的值,而是显示控制某些操作的进度。想象一下,例如你最喜欢的媒体播放器——它可能包含一些控件(我称之为轨迹栏,但英语不是我的母语,所以它可能是错误的)显示它当前正在播放的电影的哪一部分,但也允许你控制它——及时向后或向前移动并观察不同的部分。

我正是以这种方式使用轨迹栏——我不知道任何其他组件会更好(进度条不允许我改变“位置”)。它工作正常,我唯一想做的就是不允许用户“使用轨迹栏,除非电影暂停”。

出于这个确切的原因,我在 Delphi 6 中多次使用 trackbar 组件,但是当它被禁用时,它并没有变灰,在我看来它工作得很好。这就是为什么我在这里问是否有可能在 C# 中实现相同的效果。

4

3 回答 3

4

最好的方法是将Enabled属性设置为 false,正如您正确指出的那样,它也会使轨迹栏变灰。

将控件灰显是 Windows 标准,用于说“您目前无法使用此控件”,想象一下您看到了一些在禁用时未灰显的控件,尝试将它们全部用于查看哪些已启用,哪些未启用。

如果您真的想在不使用该Enabled属性的情况下防止更改,一种可能的替代方法是使用ValueChangedTrackBar 的事件

private void trackBar1_ValueChanged(object sender, EventArgs e)
{
  // Code here to restore the original value
}
于 2010-08-05T11:29:33.850 回答
0

如果你想要雄心勃勃(或过分热心),你可以创建一个透明面板控件来覆盖 TrackBar 从而防止用户与之交互,即

   public class TransparentPanel : System.Windows.Forms.Panel
   {
      private const int WS_EX_TRANSPARENT = 0x00000020;

      protected override CreateParams CreateParams
      {
         get
         {
            CreateParams transparentParams = base.CreateParams;
            transparentParams.ExStyle |= WS_EX_TRANSPARENT;
            return transparentParams;
         }
      }

      protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs e)
      {
         // Do Nothing
      }
   }

将此控件添加到您的表单中,然后将其放置在 TrackBar 上,即

transparentPanel.Location = trackBar1.Location;
transparentPanel.Size = trackBar1.Size;

然后,当您想要允许用户交互时,您可以隐藏它。

于 2010-08-05T20:48:45.357 回答
0

正如 Xander 所指出的,拥有一个看起来非常正常但实际上不能使用的轨迹栏是让用户发疯的好方法!

如果您担心轨迹栏看起来“不活动”,您可以尝试另一种显示它所代表的数据的方式,例如标签。这样,当您禁用轨迹栏时,您只是表明该值的编辑不可用。

于 2010-08-06T06:17:19.103 回答