0

我在 XAML 中布置了两个滑块:

<Border Background="Black">
    <StackPanel x:Name="LayoutRoot" Background="#FFB13232" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal">
        <Image Width="800" Height="600" />
        <Slider x:Name="bigvalue" Orientation="Vertical" Maximum="1" LargeChange="0.1" SmallChange="0.01" Value="1" />
        <Slider x:Name="smallvalue" Orientation="Vertical" Maximum="1" LargeChange="0.1" SmallChange="0.01"/>
    </StackPanel>
</Border>

...并且我想实现以下行为:如果bigvalue.Value在滑动过程中到达smallvalue.Value并且我一直向下滑动,smallvalue.Value则应该更新,类似于滑块光标之间的“碰撞检测”。

(背景:这些将控制将在图像中绘制的对象的顶部位置和底部位置,并且该对象不应具有负(top_position - bottom_position)尺寸。)

我考虑过使用属性绑定,但我的用例需要条件属性绑定,我对如何实现这一点感到困惑。

此外,目前,我宁愿不进入自制 WPF 范围滑块(带有两个光标的滑块)的领域,尽管我同意这将是“正确”的解决方案。

4

1 回答 1

2

您可以创建一个Range实现所需行为的视图模型类:

public class Range : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private double minimum;
    public double Minimum
    {
        get { return minimum; }
        set
        {
            minimum = value;
            OnPropertyChanged("Minimum");

            if (Maximum < Minimum)
            {
                Maximum = Minimum;
            }
        }
    }

    private double maximum;
    public double Maximum
    {
        get { return maximum; }
        set
        {
            maximum = value;
            OnPropertyChanged("Maximum");

            if (Minimum > Maximum)
            {
                Minimum = Maximum;
            }
        }
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

然后将两个 Sliders 绑定到两个属性MinimumMaximum

<StackPanel>
    <StackPanel.DataContext>
        <local:Range/>
    </StackPanel.DataContext>
    <Slider Value="{Binding Minimum}"/>
    <Slider Value="{Binding Maximum}"/>
</StackPanel>
于 2013-04-09T19:11:41.570 回答