나는 해결책이있다. 이것이 만드는 것은 슬라이더 엄지가 상단에 겹쳐져있는 '컨테이너'가 얼마나 꽉 찬지를 나타내는 진행률 막대입니다. 사용자는 진행률 막대 내에서 슬라이더를 현재 값까지만 이동할 수 있습니다.
오디오 녹음 컨트롤러는 어떻게 사용할 수 있습니까? 진행률 막대는 현재 녹음 된 오디오 용량과 저장 용량을 나타냅니다. 엄지 손가락은 재생 위치를 나타냅니다.
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 단계 : 그 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 단계 : 방지 슬라이더를 ValueChanged에 대한 핸들러를 구현하여 ProgressBar의 값 외부로 이동하지 마십시오.
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