WPF: Ползунок с событием, которое инициировало после пользователя, перетаскивает

Вам нужно будет генерировать sql динамически:

declare @tablename varchar(50) 

set @tablename = 'test' 

declare @sql varchar(500)

set @sql = 'select * from ' + @tablename 

exec (@sql)
51
задан Andreas Grech 6 April 2009 в 22:48
поделиться

5 ответов

Можно использовать событие 'DragCompleted' ползунка для этого. К сожалению, это только запущено при перетаскивании, таким образом, необходимо будет обработать другие щелчки и нажатия клавиш отдельно. Если Вы только хотите, чтобы это было перемещаемо, Вы могли бы отключить эти средства перемещения ползунка установкой LargeChange к 0 и Focusable ко лжи.

Пример:

<Slider Thumb.DragCompleted="MySlider_DragCompleted" />
51
ответ дан YotaXP 7 November 2019 в 09:50
поделиться

Моя реализация основана на ответе @Alan и @SandRock:

public class SliderValueChangeByDragBehavior : Behavior<Slider>
    {
        private bool hasDragStarted;

        /// <summary>
        /// On behavior attached.
        /// </summary>
        protected override void OnAttached()
        {
            AssociatedObject.AddHandler(Thumb.DragStartedEvent, (DragStartedEventHandler)Slider_DragStarted);
            AssociatedObject.AddHandler(Thumb.DragCompletedEvent, (DragCompletedEventHandler)Slider_DragCompleted);
            AssociatedObject.ValueChanged += Slider_ValueChanged;

            base.OnAttached();
        }

        /// <summary>
        /// On behavior detaching.
        /// </summary>
        protected override void OnDetaching()
        {
            base.OnDetaching();

            AssociatedObject.RemoveHandler(Thumb.DragStartedEvent, (DragStartedEventHandler)Slider_DragStarted);
            AssociatedObject.RemoveHandler(Thumb.DragCompletedEvent, (DragCompletedEventHandler)Slider_DragCompleted);
            AssociatedObject.ValueChanged -= Slider_ValueChanged;
        }

        private void updateValueBindingSource()
            => BindingOperations.GetBindingExpression(AssociatedObject, RangeBase.ValueProperty)?.UpdateSource();

        private void Slider_DragStarted(object sender, DragStartedEventArgs e)
            => hasDragStarted = true;

        private void Slider_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
        {
            hasDragStarted = false;
            updateValueBindingSource();
        }

        private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            if (!hasDragStarted)
                updateValueBindingSource();
        }
    }

можно применить его таким образом:

...
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:myWhateverNamespace="clr-namespace:My.Whatever.Namespace;assembly=My.Whatever.Assembly"
...

<Slider
                x:Name="srUserInterfaceScale"
                VerticalAlignment="Center"
                DockPanel.Dock="Bottom"
                IsMoveToPointEnabled="True"
                Maximum="{x:Static localLibraries:Library.MAX_USER_INTERFACE_SCALE}"
                Minimum="{x:Static localLibraries:Library.MIN_USER_INTERFACE_SCALE}"
                Value="{Binding Source={x:Static localProperties:Settings.Default}, Path=UserInterfaceScale, UpdateSourceTrigger=Explicit}">
                <i:Interaction.Behaviors>
                    <myWhateverNamespace:SliderValueChangeByDragBehavior />
                </i:Interaction.Behaviors>
            </Slider>

я установил UpdateSourceTrigger на явный, поскольку поведение делает это. И Вы нуждаетесь в пакете самородка Microsoft. Xaml. Поведения (.Wpf/.Uwp. Управляемый).

2
ответ дан 7 November 2019 в 09:50
поделиться
<Slider PreviewMouseUp="MySlider_DragCompleted" />

у меня работает.

Требуемое значение - это значение после события mousup, либо при щелчках сбоку, либо после перетаскивания маркера.

Поскольку MouseUp не выполняет туннелирование (оно обрабатывается раньше, чем может), вы должны использовать PreviewMouseUp.

13
ответ дан 7 November 2019 в 09:50
поделиться
<Slider x:Name="PositionSlider" Minimum="0" Maximum="100"></Slider>

PositionSlider.LostMouseCapture += new MouseEventHandler(Position_LostMouseCapture);
PositionSlider.AddHandler(Thumb.DragCompletedEvent, new DragCompletedEventHandler(Position_DragCompleted));
-1
ответ дан 7 November 2019 в 09:50
поделиться

Помимо использования события Thumb.DragCompleted , вы также можете использовать как ValueChanged , так и Thumb.DragStarted , таким образом вы не не теряет функциональность, когда пользователь изменяет значение, нажимая клавиши со стрелками или щелкая ползунок.

Xaml:

<Slider ValueChanged="Slider_ValueChanged"
    Thumb.DragStarted="Slider_DragStarted"
    Thumb.DragCompleted="Slider_DragCompleted"/>

Код позади:

private bool dragStarted = false;

private void Slider_DragCompleted(object sender, DragCompletedEventArgs e)
{
    DoWork(((Slider)sender).Value);
    this.dragStarted = false;
}

private void Slider_DragStarted(object sender, DragStartedEventArgs e)
{
    this.dragStarted = true;
}

private void Slider_ValueChanged(
    object sender,
    RoutedPropertyChangedEventArgs<double> e)
{
    if (!dragStarted)
        DoWork(e.NewValue);
}
70
ответ дан 7 November 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: