2009-09-20 6 views
1

Есть ли разумно упрощенный способ объединения трекбара с индикатором выполнения? То, что я хотел бы выполнить, чтобы индикатор прогресса только подходил к трекбару при нажатии кнопки. Это в основном для учебных целей, но было бы неплохо узнать, как использовать его на практике.C#: Как объединить TrackBar с ProgressBar

Заранее спасибо.

Нравится. http://www.java2s.com/Tutorial/VB/0260__GUI/LinkProgressBarwithaTrackBar.htm

Но внутри друг друга или вместе, а не рядом друг с другом.

ответ

2

Не уверен, что вы имеете в виду, но вы можете поместить TrackBar и ProgressBar в один пользовательский UserControl (один над другим, например).

Обновление: поскольку вы хотите, чтобы они были объединены вместо одного из лучших, лучше всего всего написать собственный UserControl с нуля.

Update 2: Click here увидеть приложение с простым UserControl, который сочетает в себе TrackBar и концепции ProgressBar (переместить ползунок изменить значение бара трека и нажмите на кнопку «Показать Прогресс», чтобы показать, как прогресс bar идет от нуля до того места, где большой палец панели треков). Click here, чтобы загрузить исходный код.

+0

Как бы это сделать? Я никогда не делал UserControl. – Nyight

+0

В принципе, вы щелкните правой кнопкой мыши на своем проекте, затем нажмите «Добавить | Управление пользователями». Пользователь UserControl похож на форму, но без оконных элементов управления (заголовок, кнопки закрытия и т. Д.). Вы можете добавить к нему другие базовые элементы управления (например, TextBox, Button и т. Д.) И инкапсулировать желаемое поведение, а затем использовать его в форме, как и любой другой элемент управления. Вот пример для UserControl, который представляет собой индикатор выполнения с градиентным цветом, чтобы начать работу: http://www.codeguru.com/csharp/csharp/cs_syntax/componentdevelopment/article.php/c15147 – MusiGenesis

+0

Есть ли в любом случае я мог бы свяжитесь с нами напрямую, если мне нужна дополнительная помощь? Как форум или еще что-то? Конечно, вы, вероятно, не захотите раздавать никаких знакомств, так что все в порядке. – Nyight

0

У меня есть решение. Это создает индикатор выполнения, который показывает, как полный контейнер имеет ползунок слайдера, наложенный сверху. Пользователь может перемещать ползунок в пределах индикатора выполнения, но только до его текущего значения.

Примером того, как вы можете использовать это, является контроллер записи звука. Индикатор выполнения показывает емкость и объем записанного звука. Большой палец указывает позицию воспроизведения.

Шаг 1: Определите стиль для слайдера и добавьте индикатор выполнения. Поместите его в ту же визуальную (ту же ячейку сетки здесь), что и большой палец. Положите его перед пальчик, так что он оказывается под ним:

<ControlTemplate x:Key="HorizontalProgressSlider" TargetType="{x:Type Slider}"> 
    <Grid Margin="5"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}"/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <TickBar x:Name="TopTick" Visibility="Collapsed" Fill="LightGray" Placement="Top" SnapsToDevicePixels="True" 
       Height="4" Margin="0,0,0,2" /> 
     <ProgressBar x:Name="TrackProgressBar" Grid.Row="1" HorizontalAlignment="Stretch" Height="10" VerticalAlignment="Center" 
       Margin="8,0,8,0" Foreground="CadetBlue"></ProgressBar> 
     <Track x:Name="PART_Track" Grid.Row="1"> 
      <Track.DecreaseRepeatButton> 
       <RepeatButton Command="{x:Static Slider.DecreaseLarge}" Style="{StaticResource SliderRepeatButtonStyle}" /> 
      </Track.DecreaseRepeatButton> 
      <Track.IncreaseRepeatButton> 
       <RepeatButton Command="{x:Static Slider.IncreaseLarge}" Style="{StaticResource SliderRepeatButtonStyle}"/> 
      </Track.IncreaseRepeatButton> 
      <Track.Thumb> 
       <Thumb x:Name="Thumb" Style="{StaticResource SliderThumbStyle}" /> 
      </Track.Thumb> 
     </Track> 
     <TickBar x:Name="BottomTick" Grid.Row="2" Visibility="Collapsed" Fill="LightGray" Placement="Bottom" 
      SnapsToDevicePixels="True" Height="4" Margin="0,2,0,0"/> 
    </Grid> 
<ControlTemplate> 

Шаг 2: Создание Attached свойств, которые могут туннель вниз, чтобы найти ProgressBar:

public class SliderProgressBarAttachedProperty : DependencyObject 
{ 
    public static readonly DependencyProperty ProgressValueProperty = 
     DependencyProperty.RegisterAttached("ProgressValue", typeof(int), typeof(SliderProgressBarAttachedProperty), new PropertyMetadata(OnItemsChanged)); 

    public static int GetProgressValue(DependencyObject obj) 
    { 
     return (int)obj.GetValue(ProgressValueProperty); 
    } 
    public static void SetProgressValue(DependencyObject obj, int value) 
    { 
     obj.SetValue(ProgressValueProperty, value); 
    } 

    public static readonly DependencyProperty ProgressMaximumProperty = 
     DependencyProperty.RegisterAttached("ProgressMaximum", typeof(int), typeof(SliderProgressBarAttachedProperty), new PropertyMetadata(OnItemsChanged)); 

    public static int GetProgressMaximum(DependencyObject obj) 
    { 
     return (int)obj.GetValue(ProgressMaximumProperty); 
    } 

    public static void SetProgressMaximum(DependencyObject obj, int value) 
    { 
     obj.SetValue(ProgressMaximumProperty, value); 
    } 

    private static void OnItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var slider = d as Slider; 

     var progressValue = GetProgressValue(d); 
     var progressMaximum = GetProgressMaximum(d); 

     if (slider == null) return; 

     var progressBar = slider.Template.FindName("TrackProgressBar",slider) as ProgressBar; 

     if (progressBar == null) return; 

     progressBar.Maximum = progressMaximum; 
     progressBar.Value = progressValue; 
    } 
} 

Шаг 3: Предотвратить ползунок от перемещения вне значения ProgressBar путем внедрения обработчика ValueChanged:

private void RangeBase_OnValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 
     var slider = sender as Slider; 


     if (slider == null) return; 


     var progressBar = (ProgressBar)slider.Template.FindName("TrackProgressBar", slider); 


     if (progressBar == null) return; 


     if (e.NewValue > progressBar.Value) 
     { 
      slider.Value = progressBar.Value; 
      e.Handled = true; 
      return; 
     } 
    }