2012-07-26 6 views
1

Je souhaite que le curseur revienne à 0 lorsque l'utilisateur arrête de glisser.Le curseur doit retourner à

Jusqu'à présent, j'ai ceci:

<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> 

Cela fonctionne aussi longtemps que je ne lie pas la valeur du curseur à mon DependencyProperty ZSpeed.

Dès que je fais cela, le curseur revient à la valeur d'origine et à la deuxième tentative, le curseur ne peut plus être déplacé.

Alors que puis-je faire (de préférence en xaml) pour que l'animation modifie non seulement le curseur mais aussi la propriété ZSpeed?

EDIT

code

dans 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

ne spécifie 'OneWay' sur l'aide à la liaison? – paul

+0

Oui, mais ZSpeed ​​n'est pas défini en conséquence. – MTR

+0

Pourquoi ne liez-vous pas votre commentaire à 'ZSpeed'? Le curseur sera mis à jour automatiquement. Disclaimer: Je n'ai jamais travaillé avec des animations, donc je ne sais pas si ça va marcher. –

Répondre

1

Vous pouvez inverser le sens de la liaison. Au lieu de lier les Value du curseur à ZSpeed, vous pouvez lier ZSpeed à Value. Ce serait aussi la direction de liaison "naturelle" si le Slider est destiné à changer ZSpeed, mais ZSpeed ne changera pas autrement.

EDIT: Si ZSpeed est une propriété de dépendance dans une classe de données MyData vous pouvez créer une fixation dans le code comme ceci:

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

DEUXIÈME EDIT: Reprenant la suggestion Daniels, vous pouvez animer ZSpeed au lieu de le curseur Value. Lier le Value à ZSpeed comme avant, retirer le EventTrigger et ajouter un gestionnaire d'événements pour LostMouseCapture:

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

code derrière:

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 ​​est une DependencyProperty de mon modèle de vue, comment puis-je faire cela? Je ne sais pas comment "inverser la direction de la liaison". Et d'ailleurs, ZSpeed ​​peut changer autrement. – MTR

+0

Voir les réponses aux questions. – Clemens

+0

Après avoir fait ceci: Binding binding = new Binding ("Value") {Source = ZSlider}; this.SetBinding (ZSpeedProperty, liaison); ZSpeed ​​est animé à 0 puis revient à la valeur d'origine. Le curseur ne bouge pas pendant l'exécution de l'animation. – MTR

1

Vous devez utiliser FillBehavior.HoldEnd.

Modifier: Cela ne semble pas fonctionner. Vous pouvez définir la valeur ZSpeed sur 0 manuellement dans l'événement StoryBoard.Completed.

+0

HoldEnd fige le curseur après l'animation. – MTR

Questions connexes