【问题标题】:Slider completely change ticks more than once滑块多次完全更改刻度
【发布时间】:2016-01-12 13:35:06
【问题描述】:

我有一个滑块绑定到具有一组值的 DoubleCollection Ticks(通过 Ticks="{Binding Ticks}")。 Ticks 集合最终会被清除并填充完全不同的值。问题是在重新填充之后,即使集合中的值已经不同,滑块仍然会按旧刻度移动。

如何解决这个问题?

【问题讨论】:

    标签: c# wpf xaml binding slider


    【解决方案1】:

    tick 集合似乎不依赖于最小值和最大值。

    滑块值取决于最小值和最大值,刻度只是“装饰”。

    上面的例子应该可以工作。

    基本上,在更改刻度集合时,我会更改 MinimumMaximum 绑定值以适应刻度集合的最小值和最大值。

    C#部分:

    public partial class MainWindow : Window,INotifyPropertyChanged
    {
        private double _value;
        private double _minimum;
        private double _maximum;
        private DoubleCollection _tickCollection;
    
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
    
            TickCollection = new DoubleCollection();
            for (double i = 0.0; i < 5.0; i+=0.5)
            {
                TickCollection.Add(i);
            }
            Minimum = 0.0;
            Maximum = 5.0;
            Value = 2.3;
    
        }
    
        public double Value
        {
            get { return _value; }
            set
            {
                _value = value;
                OnPropertyChanged();
            }
        }
    
        public double Minimum
        {
            get { return _minimum; }
            set { _minimum = value; OnPropertyChanged(); }
        }
    
        public double Maximum
        {
            get { return _maximum; }
            set { _maximum = value; OnPropertyChanged(); }
        }
    
        public DoubleCollection TickCollection
        {
            get { return _tickCollection; }
            set
            {
                _tickCollection = value;
                OnPropertyChanged();
            }
        }
    
        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            TickCollection = new DoubleCollection();
            for (double i = 5.0; i < 10.0; i += 1.0)
            {
                TickCollection.Add(i);
            }
            Minimum = 5.0;
            Maximum = 10.0;
            Value = 2.3;
    
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    XAML 对话:

        <Grid>
        <Slider x:Name="mySlider" Width="400" Height="40" Ticks="{Binding TickCollection}"
                TickPlacement="TopLeft"
                Minimum="{Binding Minimum}"
                Maximum="{Binding Maximum}"
                Value="{Binding Value,Mode=TwoWay}"
                ></Slider>
    
        <TextBlock Text="{Binding Value}" HorizontalAlignment="Center" Margin="0,20" VerticalAlignment="Top"></TextBlock>
        <Button Content="Change Ticks" Click="ButtonBase_OnClick" HorizontalAlignment="Center" Margin="0,60" VerticalAlignment="Top"></Button>
    </Grid>
    

    【讨论】:

    • 感谢您发现这一点。我实际上绑定了最小值和最大值,但我只是忘记在更新时通知它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2019-05-30
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多