2009-09-20 2 views
1

트랙 막대와 진행 막대를 결합하는 방법은 비교적 간단합니까? 진행률 표시 줄이 단추를 클릭 할 때 트랙 바에 만 올라가도록 할 수 있어야합니다. 이것은 주로 학습 목적을위한 것이지만 실용적인 방법으로 그것을 사용하는 방법을 아는 것도 좋을 것입니다.C# : TrackBar와 ProgressBar를 결합하는 방법

미리 감사드립니다.

[편집] 이렇게하면됩니다. http://www.java2s.com/Tutorial/VB/0260__GUI/LinkProgressBarwithaTrackBar.htm

그러나 서로의 내부 또는 서로 대신에 결합 된.

답변

2

정확히 무슨 뜻인지 잘 모르겠지만 TrackBar와 ProgressBar를 단일 사용자 정의 UserControl (예 : 다른 하나 위에)에 배치 할 수 있습니다.

업데이트 : 다른 하나의 조합 대신 다른 조합을 사용하려는 경우 가장 좋은 방법은 처음부터 고유 한 UserControl을 작성하는 것입니다.

2 업데이트 : (트랙 바의 값을 변경하려면 슬라이더를 이동 트랙 바 및 ProgressBar의 개념을 결합하는 간단한 UserControl을 사용하여 응용 프로그램을 확인하고 "진행보기"버튼을 클릭 Click here 어떻게 진행 상태를 표시합니다 막대는 트랙 바의 엄지가 어디에 있든간에 0부터 시작합니다). 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 단계 : 그 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; 
     } 
    } 
관련 문제