1

ユーザーがドラッグを停止すると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>

これは、スライダーの値をDependencyPropertyZSpeedにバインドしない限り機能します。

これを行うとすぐに、スライダーが元の値に戻り、2回目の試行でスライダーをドラッグできなくなります。

では、アニメーションにスライダーだけでなく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); 
    }

}
4

2 に答える 2

1

バインディングの方向を逆にすることができます。スライダーをにバインドする代わりに、にValueバインドすることZSpeedができます。スライダーが変更される場合、これは「自然な」バインド方向にもなりますが、それ以外の場合は変更されません。ZSpeedValueZSpeedZSpeed

編集:ZSpeedが一部のデータクラスの依存関係プロパティである場合MyData、次のようなコードでバインディングを作成できます。

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

2番目の編集:ダニエルズの提案を拾い上げてZSpeed、スライダーの代わりにアニメートするかもしれませんValue。前と同じようにをにバインドしValueZSpeedEventTriggerを削除して、次のイベントハンドラーを追加しLostMouseCaptureます。

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

背後にあるコード:

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);
}
于 2012-07-26T12:57:17.360 に答える
1

を使用する必要がありますFillBehavior.HoldEnd

編集:それは明らかに機能しません。ZSpeedイベントでは、値を手動で0に設定できますStoryBoard.Completed

于 2012-07-26T13:00:06.270 に答える