检测何时更改滚动条最大值



简单问题。有:

<ScrollBar ... />

如何检测Maximum何时更改?例如。对于Value有一个事件。

通常会有某种绑定。我当时认为也许有可能获得这种绑定,创建依赖性属性并与之绑定,然后我可以在更改此新的依赖性属性时注册回调...但是听起来很复杂,我也可以确定它是可以接受的解决方案所有情况(例如,如果设置了另一种绑定,如何检测这种更改)。轮询?

您可以创建一个自定义类,例如:

public class MScrollBar : System.Windows.Controls.Primitives.ScrollBar
{ 
    protected override void OnMaximumChanged(double oldMaximum, double newMaximum)
    {
        // do stuff
        base.OnMaximumChanged(oldMaximum, newMaximum);
    }
}

public class MScrollBar : System.Windows.Controls.Primitives.ScrollBar
{
    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        if (e.Property == System.Windows.Controls.Primitives.ScrollBar.MaximumProperty)
        {
            // do stuff
        }
        base.OnPropertyChanged(e);
    }
}

重要的是要了解任何属性可以是多个绑定的 source 。我们可以创建一个新的目标(新的依赖属性),然后完美地报告了对属性所做的任何更改:

  1. 使用回调创建一个新的依赖项属性。

  2. 将其绑定到任何其他属性以监视更改。

public partial class MainWindow : Window
{
    public double Maximum
    {
        get { return (double)GetValue(MaximumProperty); }
        set { SetValue(MaximumProperty, value); }
    }
    public static readonly DependencyProperty MaximumProperty =
        DependencyProperty.Register("Maximum", typeof(double), typeof(MainWindow), new PropertyMetadata(0, (d, e) =>
        {
            // value has changed
        }));
    public MainWindow()
    {
        InitializeComponent();
        var scrollBar = ... // instance of scrollbar
        BindingOperations.SetBinding(this, MaximumProperty,
            new Binding(nameof(RangeBase.Maximum)) { Source = scrollBar });
    }
}

最新更新