简体   繁体   English

IsDirectionReversed更改时,拇指位置无效

[英]Invalidate Thumb position when IsDirectionReversed changes

I'm using a slider control in a C# WPF application and want to offer the ability for users to invert the control on the fly. 我在C#WPF应用程序中使用滑块控件,并希望为用户提供即时反转控件的功能。

I've already established that the slider control has a built in IsDirectionReversed property which works well for changing the direction of the control (effectively swapping its minimum and maximum values to opposite ends of the control). 我已经确定滑块控件具有内置的IsDirectionReversed属性,该属性很好地用于更改控件的方向(有效地将其最小值和最大值交换到控件的相对两端)。 However, when the property is changed on the fly, the thumb position remains where it is (visually implying an incorrect value) but its value remains the same (as I would expect). 但是,在即时更改属性时,拇指的位置会保持在原位置(在视觉上暗示不正确的值),但其值会保持不变(与我期望的一样)。

必要行为的例子

(After inverting the control, clicking anywhere on the track causes the thumb to update to either +1 or -1 of its current value but repositions the thumb into its correct visual position) (在反转控件后,单击轨道上的任何位置都会使拇指更新为当前值的+1或-1,但会将拇指重新定位到正确的可视位置)

Can anyone suggest a way of forcing the thumb to update its position when the inverted property is changed? 有人可以建议一种方法,在更改反转属性时,强制拇指更新其位置吗?

XAML XAML

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        Title="MainWindow" Height="139" Width="303">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="10"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="10"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="10"/>
        </Grid.ColumnDefinitions>

        <Slider Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Name="SliderControl" HorizontalAlignment="Left" VerticalAlignment="Top" Width="276" IsDirectionReversed="{Binding Inverted}" Maximum="100" Minimum="1" SmallChange="1"/>

        <TextBlock Grid.Row="2" Grid.Column="1" Text="Value:" HorizontalAlignment="Left" VerticalAlignment="Top" />
        <TextBlock Grid.Row="2" Grid.Column="2" Text="{Binding ElementName=SliderControl, Path=Value}" HorizontalAlignment="Left" VerticalAlignment="Top"/>

        <TextBlock Grid.Row="3" Grid.Column="1" Text="Inverted:" HorizontalAlignment="Left" VerticalAlignment="Top" />

        <TextBlock Grid.Row="3" Grid.Column="2" Text="{Binding ElementName=SliderControl, Path=IsDirectionReversed}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <Button Grid.Row="4" Grid.Column="2" Content="Flip!" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>
</Window>

C# C#

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public bool mSliderInverted = false;

    public bool Inverted
    {
        get
        {
            return mSliderInverted;
        }
    }

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        mSliderInverted = !mSliderInverted;
        OnPropertyChanged("Inverted");
    }

    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, e);
    }

    protected void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

It seems flipping the IsDirectionInversed property doesn't cause the control to rerender, I'd say this is a bug in WPF (Bug in WPF!? No way!). 似乎翻转IsDirectionInversed属性不会导致控件重新呈现,我想说这是WPF中的错误(WPF中的错误!?没办法!)。

By trial and error, I discovered that if you invalidate the PART_Track part of the slider (The element that contains the RepeatButtons and the Thumb), it magically switches it around and everything works the way it should! 通过反复试验,我发现如果使滑块的PART_Track部分(包含RepeatButtons和Thumb的元素)无效,它会神奇地切换它,一切都会按照应有的方式运行!

So if you just modify your Button_Click handler to look like this, everything should work just fine. 因此,如果您只是将Button_Click处理程序修改为如下所示,则一切都应该正常工作。 :-) :-)

private void Button_Click(object sender, RoutedEventArgs e)
{
    mSliderInverted = !mSliderInverted;
    OnPropertyChanged("Inverted");

    // Retrieve the Track from the Slider control
    var track = SliderControl.Template.FindName("PART_Track", SliderControl) as Track;

    // Force it to rerender
    track.InvalidateVisual();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM