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;
}
}
Comment est-ce que je ferais ceci? Je n'ai jamais fait UserControl. – Nyight
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
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