2009-09-20 9 views
1

Existe-t-il une manière raisonnablement simpliste de combiner une barre de suivi avec une barre de progression? Ce que j'aimerais pouvoir accomplir pour que la barre de progression ne monte que sur la barre de navigation lorsqu'un bouton est cliqué. Ceci est principalement à des fins d'apprentissage, mais il serait bon de savoir comment l'utiliser de manière pratique.C#: Comment combiner TrackBar avec ProgressBar

Merci d'avance.

[edit] Comme ceci. http://www.java2s.com/Tutorial/VB/0260__GUI/LinkProgressBarwithaTrackBar.htm

Mais à l'intérieur les uns des autres, ou combinés, au lieu de l'un à côté de l'autre.

Répondre

2

Vous ne savez pas exactement ce que vous voulez dire, mais vous pourriez placer un TrackBar et un ProgressBar dans un seul UserControl personnalisé (l'un au-dessus de l'autre, par exemple).

Mise à jour: comme vous voulez les combiner au lieu de l'un des meilleurs de l'autre, le mieux est de simplement écrire votre propre UserControl.

Mise à jour 2: Click here voir une application avec un simple UserControl qui combine les TrackBar et les concepts de ProgressBar (déplacer le curseur pour modifier la valeur de la barre de piste, et cliquez sur le bouton « Afficher la progression » pour montrer comment les progrès la barre va de zéro à n'importe où le pouce de la barre de la piste). Click here pour télécharger le code source.

+0

Comment est-ce que je ferais ceci? Je n'ai jamais fait UserControl. – Nyight

+0

Fondamentalement, vous faites un clic droit sur votre projet, puis cliquez sur "Ajouter | Contrôle utilisateur". Un UserControl est un peu comme un formulaire, mais sans contrôles de fenêtre (barre de titre, boutons de fermeture, etc.). Vous pouvez y ajouter d'autres contrôles de base (comme un TextBox, un Button, etc.) et encapsuler le comportement souhaité, puis l'utiliser sur un formulaire comme n'importe quel autre contrôle. Voici un exemple pour un UserControl qui est une barre de progression avec une couleur de dégradé, pour vous aider à démarrer: http://www.codeguru.com/csharp/csharp/cs_syntax/componentdevelopment/article.php/c15147 – MusiGenesis

+0

Y at-il de toute façon que je pourrais vous contacter directement si j'ai besoin de plus d'aide? Comme un forum ou quelque chose? Certes, vous ne voudrez probablement pas donner des rencontres, donc c'est bien. – Nyight

0

J'ai une solution. Ce que cela crée est une barre de progression qui indique à quel point un «conteneur» est complet avec un curseur superposé sur le dessus. L'utilisateur peut déplacer le curseur dans la barre de progression, mais seulement jusqu'à sa valeur actuelle.

Un exemple de la façon dont vous pourriez utiliser ceci est un contrôleur d'enregistrement audio. La barre de progression indique la capacité de stockage et la quantité d'audio actuellement enregistrée. Le pouce indique la position de lecture.

Étape 1: Définissez un style pour le curseur et ajoutez une barre de progression. Placez-le dans le même visuel (la même cellule de grille ici) que le pouce. Mettez avant le pouce afin qu'il soit rendu dessous:

<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> 

Étape 2: Créer des propriétés jointes qui peuvent tunnel vers le bas pour trouver la barre de progression:

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; 
    } 
} 

Étape 3: Empêcher le curseur de se déplacer en dehors de la valeur de ProgressBar en implémentant un gestionnaire pour 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; 
     } 
    } 
Questions connexes