System.Windows.Forms.Trackbar - как запретить пользователю перетаскивать слайдер? - PullRequest
1 голос
/ 05 августа 2010

Есть ли какой-нибудь способ (временно) запретить пользователю изменять значение TrackBar, перетаскивая ползунок? Единственный способ, который я нашел, - установить для свойства Enabled значение false, но оно также не отображает трекбар.

Edit: Поскольку я получаю больше ответов о том, почему я не должен это делать, а не о том, как это возможно, я решил объяснить, почему я хотел бы это сделать.

Я не использую его, чтобы разрешить пользователю настраивать значение какого-либо свойства приложения, но отображает и контролирует ход выполнения какого-либо действия. Представьте себе, например, ваш любимый медиаплеер - он, вероятно, содержит некоторый элемент управления (я бы назвал его трекбаром, но английский не мой родной язык, так что, возможно, он ошибается) отображает , какую часть фильма он воспроизводит в данный момент, но также позволяет вам контролировать это - перемещаться назад или вперед во времени и смотреть другую часть.

Я использую трекбар именно таким образом - я не знаю других компонентов, которые были бы лучше (Progressbar не позволит мне изменить «позицию»). Работает нормально, Единственное, что я хотел бы сделать, это не позволить пользователю «использовать трекбар, если фильм не остановлен».

Именно по этой причине я много раз использовал компонент trackbar в Delphi 6, но когда он был отключен, он не выделялся серым цветом и, по моему мнению, работал нормально. Вот почему я спросил здесь, если возможно достичь того же эффекта в C #.

Ответы [ 3 ]

4 голосов
/ 05 августа 2010

Лучшим способом было бы установить для свойства Enabled значение false, поскольку, как вы правильно заметили, оно также затеняет полосу трека.

Затенение элементов управления - это стандарт Windows, в котором говорится «Вы не можете использовать этот элемент управления в данный момент», просто представьте, что вам представили некоторые элементы управления, которые не были выделены серым цветом там, где отключены, это было бы очень хитом ипропустите, пытаясь их всех увидеть, что включено, а что нет.

Если вы действительно хотите предотвратить изменения без использования свойства Enabled, то одной из возможных альтернатив является использование ValueChanged событие TrackBar

private void trackBar1_ValueChanged(object sender, EventArgs e)
{
  // Code here to restore the original value
}
0 голосов
/ 06 августа 2010

Как указал Ксандер, наличие трекбара, который выглядит совершенно нормально, но на самом деле не может быть использован, - это хороший способ свести с ума ваших пользователей!

Если вы беспокоитесь о том, что трекбар выглядит "неактивным"Вы можете попробовать другой способ отображения данных, которые он представляет, например, метку.Таким образом, когда вы отключаете трекбар, вы только указываете, что редактирование значения недоступно.

0 голосов
/ 06 августа 2010

Если вы хотите быть амбициозным (или чрезмерно усердным), вы можете создать прозрачный элемент управления для наложения на трекбар, предотвращая тем самым взаимодействие пользователя с ним, т.е.

   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;

Тогда вы можете скрыть это, если хотите разрешить взаимодействие с пользователем.

...