C# System.Windows.Forms.Trackbar-如何防止用户拖动滑块?

C# System.Windows.Forms.Trackbar-如何防止用户拖动滑块?,c#,winforms,trackbar,C#,Winforms,Trackbar,是否有某种方法可以暂时阻止用户通过拖动滑块来更改轨迹栏的值?我找到的唯一方法是将Enabled属性设置为false,但它也会使轨迹栏变灰 编辑: 因为我得到了更多关于为什么我不应该做而不是如何做的答案,我决定解释为什么我想做 我不是用它来允许用户调整某些应用程序属性的值,而是用来显示和控制某些操作的进度。例如,想象一下你最喜欢的媒体播放器——它可能包含一些控件,我称之为trackbar,但英语不是我的母语,所以它可能是错误的 它可以显示当前正在播放的电影的哪一部分,但也可以让你控制它——在时间上

是否有某种方法可以暂时阻止用户通过拖动滑块来更改轨迹栏的值?我找到的唯一方法是将Enabled属性设置为false,但它也会使轨迹栏变灰

编辑: 因为我得到了更多关于为什么我不应该做而不是如何做的答案,我决定解释为什么我想做

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

我就是这样使用轨迹栏的——我不知道还有什么其他组件比Progressbar更好,Progressbar不允许我改变位置。很好用, 我唯一想做的就是不允许用户使用轨迹栏,除非电影暂停

正是因为这个原因,我在Delphi6中多次使用trackbar组件,但当它被禁用时,它并没有变灰,在我看来,它工作得很好。这就是我问的原因
在这里,如果可以在C中实现相同的效果,最好的方法是将Enabled属性设置为false,正如您正确指出的那样,它也会使轨迹栏变灰

灰显控件是windows的一个标准,表示您目前无法使用此控件,想象一下您看到的一些控件在禁用时未灰显,尝试所有控件以查看哪些已启用,哪些未启用将是一件非常偶然的事情

如果确实希望在不使用Enabled属性的情况下防止更改,一种可能的替代方法是使用TrackBar的ValueChanged事件

private void trackBar1_ValueChanged(object sender, EventArgs e)
{
  // Code here to restore the original value
}

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

灰显控件是windows的一个标准,表示您目前无法使用此控件,想象一下您看到的一些控件在禁用时未灰显,尝试所有控件以查看哪些已启用,哪些未启用将是一件非常偶然的事情

如果确实希望在不使用Enabled属性的情况下防止更改,一种可能的替代方法是使用TrackBar的ValueChanged事件

private void trackBar1_ValueChanged(object sender, EventArgs e)
{
  // Code here to restore the original value
}

如果你想雄心勃勃或过于热情,你可以创建一个透明的面板控件来覆盖轨迹栏,从而防止用户与之交互,即

   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
      }
   }
将此控件添加到窗体中,然后将其放置在轨迹栏上,即

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

然后,当您希望允许用户交互时,可以将其隐藏。

如果您想要雄心勃勃或过于热情,可以创建一个透明的面板控件来覆盖轨迹栏,从而防止用户与它交互,即

   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
      }
   }
将此控件添加到窗体中,然后将其放置在轨迹栏上,即

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

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

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


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

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


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

我不想灰显轨迹栏,因为我认为灰显的组件是非活动组件。。。这不是我的情况,我的轨迹栏总是处于活动状态,有时只是用户不能修改它的值,因为它是通过编程修改的。。。使用ValueChanged事件是个好主意,即使当我尝试移动滑块时,滑块有时会闪烁,并且它会立即返回到正确的位置-这就是为什么我想以某种方式阻止用户移动滑块的原因。。。不过还是要谢谢你!所以我想除了价值改变事件没有别的办法了,所以我接受你的答案。。。再次感谢…我想知道启用双缓冲是否有助于减少闪烁?或者通过GDI+创建您自己的自定义控件,除非特别启用,否则不会接受用户输入?我不想灰显轨迹栏,因为我认为灰显的组件是非活动的。。。这不是我的情况,我的轨迹栏总是处于活动状态,有时只是用户不能修改它的值,因为它是mo
按程序修改。。。使用ValueChanged事件是个好主意,即使当我尝试移动滑块时,滑块有时会闪烁,并且它会立即返回到正确的位置-这就是为什么我想以某种方式阻止用户移动滑块的原因。。。不过还是要谢谢你!所以我想除了价值改变事件没有别的办法了,所以我接受你的答案。。。再次感谢…我想知道启用双缓冲是否有助于减少闪烁?或者通过GDI+创建您自己的自定义控件,除非特别启用,否则将不接受用户输入?谢谢您的回答,但我更想知道是否以及如何能够做到这一点。。。我使用它的方式可能与你想象的不同,但我不知道还有其他组件能做得更好。。。我已经编辑了我的问题并在那里解释了…谢谢你的回答,但我真的更想知道是否以及如何做到这一点。。。我使用它的方式可能与你想象的不同,但我不知道还有其他组件能做得更好。。。我编辑了我的问题并在那里解释了它。。。