2012-07-26 4 views
1

사용자가 끌기를 멈 추면 슬라이더를 0으로 되돌리고 싶습니다. 이만큼 내 DependencyProperty에 ZSpeed ​​슬라이더 값을 결합하지 않는 한 작동슬라이더가 0으로 돌아갑니다.

<Window x:Class="CenteredSliderTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<DockPanel> 
    <!--Value="{Binding ZSpeed}"--> 
    <Slider DockPanel.Dock="Left" 
           x:Name="ZSlider" 
           Minimum="-100" Maximum="100" 
           SelectionStart="-20" SelectionEnd="20" 
           Orientation="Vertical" 
           TickFrequency="10" 
           TickPlacement="TopLeft" 
           AutoToolTipPlacement="TopLeft" 
           AutoToolTipPrecision="2" 
           LargeChange="10" 
           SmallChange="1" 
           IsDirectionReversed="True" 
           Focusable="False" 
           > 
     <Slider.Triggers> 
      <EventTrigger RoutedEvent="LostMouseCapture" SourceName="ZSlider"> 
       <EventTrigger.Actions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation 
           Storyboard.TargetName="ZSlider" 
           Storyboard.TargetProperty="Value" 
           From="{Binding Value, ElementName=ZSlider}" 
           To="0.0" 
           Duration="0:0:1.5" 
           FillBehavior="Stop" 
           /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger.Actions> 

      </EventTrigger> 
     </Slider.Triggers> 
    </Slider> 
    <TextBlock Text="{Binding ZSpeed}" /> 
</DockPanel> 
</Window> 

:

지금까지 나는이 있습니다.

이렇게하면 슬라이더가 원래 값으로 돌아가고 두 번째 시도에서는 슬라이더를 더 이상 끌 수 없습니다.

애니메이션을 얻으려면 슬라이더뿐만 아니라 ZSpeed ​​속성도 수정하면됩니다 (xaml에서 더 좋음). MainWindow를에

편집

코드 :

public partial class MainWindow : Window 
{ 


    public double ZSpeed 
    { 
     get { return (double)GetValue(ZSpeedProperty); } 
     set { SetValue(ZSpeedProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ZSpeed. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ZSpeedProperty = 
     DependencyProperty.Register("ZSpeed", typeof(double), typeof(MainWindow), new UIPropertyMetadata(0.0)); 



    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 

     Binding binding = new Binding("Value") { Source = ZSlider }; 
     this.SetBinding(ZSpeedProperty, binding); 
    } 

} 
+0

바인딩 도움말에 'OneWay'가 지정되어 있습니까? – paul

+0

예, 그렇지만 ZSpeed가 그에 따라 설정되지 않았습니다. – MTR

+0

왜 anymation을'ZSpeed'에 바인딩하지 않습니까? 슬라이더가 자동으로 업데이트됩니다. 면책 조항 : 저는 애니메이션 작업을 해 본적이 없으므로 이것이 제대로 작동하는지 모르겠습니다. –

답변

1

당신은 바인딩의 방향을 반대로 할 수도 있습니다. 슬라이더의 ValueZSpeed에 바인딩하는 대신 ZSpeedValue에 바인딩 할 수 있습니다. 슬라이더가 ZSpeed을 변경하려는 경우 "자연"바인딩 방향이되지만, 그렇지 않은 경우 ZSpeed은 변경되지 않습니다.

편집 :

MyData dataObject = ... 
Binding binding = new Binding("Value") { Source = ZSlider }; 
dataObject.SetBinding(MyData.ZSpeedProperty, binding); 

SECOND 편집 : : 다니엘스의 제안을 따기, 당신은 ZSpeed 애니메이션을 대신 할 수 ZSpeed 당신이이 같은 코드에서 바인딩을 만들 수 MyData 일부 데이터 클래스의 종속성 속성 인 경우 슬라이더의 Value 이전과 ValueZSpeed에를 결합하는 EventTrigger를 제거하고 LostMouseCapture에 대한 이벤트 처리기를 추가 :

<Slider x:Name="ZSlider" ... 
     Value="{Binding ZSpeed}" 
     LostMouseCapture="ZSlider_LostMouseCapture"/> 

코드 뒤에 : 당신은 FillBehavior.HoldEnd를 사용한다

private void ZSlider_LostMouseCapture(object sender, MouseEventArgs e) 
{ 
    DoubleAnimation animation = new DoubleAnimation 
    { 
     From = ZSpeed, 
     To = 0d, 
     Duration = TimeSpan.FromSeconds(1.5 * Math.Abs(ZSpeed)/100d), 
     FillBehavior = FillBehavior.Stop 
    }; 
    ZSpeed = 0d; 
    BeginAnimation(ZSpeedProperty, animation); 
} 
+0

ZSpeed는 내 뷰 모델의 DependencyProperty입니다. 어떻게해야합니까? 나는 "바인딩의 방향을 바꾸는"방법을 모른다. 그리고 ZSpeed는 다른 방식으로 변경 될 수 있습니다. – MTR

+0

편집 된 답변보기 – Clemens

+0

이 작업을 수행 한 후 : 바인딩 바인딩 = 새 바인딩 ("값") {원본 = ZSlider}; this.SetBinding (ZSpeedProperty, binding); ZSpeed가 0으로 애니메이션 된 다음 원래 값으로 다시 이동합니다. 애니메이션이 실행되는 동안 슬라이더가 움직이지 않습니다. – MTR

1

.

편집 : 분명히 작동하지 않습니다. StoryBoard.Completed 이벤트에서 ZSpeed 값을 수동으로 0으로 설정할 수 있습니다.

+0

HoldEnd는 애니메이션 후에 슬라이더를 고정시킵니다. – MTR

관련 문제