У меня есть решение. Это создает индикатор выполнения, который показывает, как полный контейнер имеет ползунок слайдера, наложенный сверху. Пользователь может перемещать ползунок в пределах индикатора выполнения, но только до его текущего значения.
Примером того, как вы можете использовать это, является контроллер записи звука. Индикатор выполнения показывает емкость и объем записанного звука. Большой палец указывает позицию воспроизведения.
Шаг 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;
}
}
Как бы это сделать? Я никогда не делал UserControl. – Nyight
В принципе, вы щелкните правой кнопкой мыши на своем проекте, затем нажмите «Добавить | Управление пользователями». Пользователь UserControl похож на форму, но без оконных элементов управления (заголовок, кнопки закрытия и т. Д.). Вы можете добавить к нему другие базовые элементы управления (например, TextBox, Button и т. Д.) И инкапсулировать желаемое поведение, а затем использовать его в форме, как и любой другой элемент управления. Вот пример для UserControl, который представляет собой индикатор выполнения с градиентным цветом, чтобы начать работу: http://www.codeguru.com/csharp/csharp/cs_syntax/componentdevelopment/article.php/c15147 – MusiGenesis
Есть ли в любом случае я мог бы свяжитесь с нами напрямую, если мне нужна дополнительная помощь? Как форум или еще что-то? Конечно, вы, вероятно, не захотите раздавать никаких знакомств, так что все в порядке. – Nyight