2010-08-05 2 views
1

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

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

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

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

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

ответ

4

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

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

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

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

Я не хочу седеть из трекбара, потому что, по моему мнению, серые компоненты неактивны ... что не мое дело, мой трекбал всегда активен, иногда просто пользователь не может изменить его значение, потому что он изменен программно ... Использование события ValueChanged - хорошая идея, хотя слайдер иногда «мигает», когда я пытаюсь переместить его, и он сразу возвращается в правильное положение - вот почему я хотел каким-то образом помешать пользователю перемещать Ползунок вообще ... Но, во всяком случае, спасибо! –

+0

Итак, я думаю, что нет другого способа, чем событие ValueChanged, поэтому я принимаю ваш ответ ... Еще раз спасибо ... –

+0

Интересно, поможет ли включение двойной буферизации уменьшить мерцание? Или, альтернативно, создать собственный пользовательский элемент управления через GDI +, который не будет принимать пользовательский ввод, если он специально не включен? – Xander

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; 

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

0

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

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

+0

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