2017-05-24 27 views
2

如果我有一个定义了Change属性的WPF滚动条,为什么仍然有可能有一个真实值,如123.456,这不是我的多个步骤?强制WPF滚动条只落在整数值

<ScrollBar Minimum="-5000" Maximum="5000" SmallChange="1" LargeChange="25"></ScrollBar> 

有没有办法强制滚动条只设置整数的值,步骤的倍数或两者?

大多数在这个问题上现有的文件似乎针对WPF滑块(可使用IsSnapToTickEnabled)或ScrollViewers(使用IScrollInfo内容控件),这两者都不具有ScrollBar等效方案。

+0

'ScrollViewer'从'派生System.Windows.Controls.ContentControl'。 ScrollBar从'System.Windows.Controls.Primitives.RangeBase'派生,与'ProgressBar'和'Slider'相同。 – Scorpion

+0

附加的行为答案仍然正常工作。只要看看ValueChanged事件而不是ScrollChanged事件。 –

+0

如果您有工作实施,请将其作为答案提交。我查看过基于行为的解决方案,它不适用于ScrollBar。 'ScrollViewer'是一个内容控件,用于将其子元素移动到视口上的滚动事件中,而'ScrollBar'只是一个跟踪+范围。 'ScrollBar'的实现也完全不同,因为它无法使用'IScrollInfo'和一个完全独立的属性集合。他们不一样! – Scorpion

回答

1

我相信你应该能够通过行为控制步进的粒度。端点(最小值和最大值)是最棘手的,但我会在这里,踩灭了粗略的想法:

附加的行为:

public class StepScrollBehavior : Behavior<ScrollBar> 
{ 
    protected override void OnAttached() 
    { 
     AssociatedObject.ValueChanged += AssociatedObject_ValueChanged; 
     base.OnAttached(); 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.ValueChanged -= AssociatedObject_ValueChanged; 
     base.OnDetaching(); 
    } 
    private void AssociatedObject_ValueChanged(object sender, 
      System.Windows.RoutedPropertyChangedEventArgs<double> e) 
    { 
     var scrollBar = (ScrollBar)sender; 
     var newvalue = Math.Round(e.NewValue, 0); 
     if (newvalue > scrollBar.Maximum) 
      newvalue = scrollBar.Maximum; 
     // feel free to add code to test against the min, too. 
     scrollBar.Value = newvalue; 
    } 
} 

用法:

<ScrollBar Minimum="-5000" Maximum="5000"> 
     <i:Interaction.Behaviors> 
      <local:StepScrollBehavior/> 
     </i:Interaction.Behaviors> 
    </ScrollBar> 
+0

我不清楚我们是否需要在ValueChanged事件中设置“e.Handled = true;”。我们可能需要,否则它可能会让我们陷入困境。 –