C# 为什么Silverlight slider ValueChanged会被多次触发,而它只被单击一次?

C# 为什么Silverlight slider ValueChanged会被多次触发,而它只被单击一次?,c#,.net,wpf,silverlight,C#,.net,Wpf,Silverlight,我确实放了一个计数器,它确实增加了很多倍,而只需点击一次滑块(根本没有拖动),为什么 名称空间测试滑块 { 公共部分类主页面:UserControl { 专用整数计数器=0; 公共主页() { 初始化组件(); } 私有无效滑块1_值已更改(对象发送方,RoutedPropertyChangedEventArgs e) { 计数器=计数器+1; } } } 首先,我认为这不是一个编程问题,如果是,我可能还没有很好地理解它 无论如何,请考虑滑块行为:可以通过在滑块行中单击多次或仅通过将滑块按钮拖动

我确实放了一个计数器,它确实增加了很多倍,而只需点击一次滑块(根本没有拖动),为什么

名称空间测试滑块
{
公共部分类主页面:UserControl
{
专用整数计数器=0;
公共主页()
{
初始化组件();
}
私有无效滑块1_值已更改(对象发送方,RoutedPropertyChangedEventArgs e)
{
计数器=计数器+1;
}
}
}

首先,我认为这不是一个编程问题,如果是,我可能还没有很好地理解它

无论如何,请考虑滑块行为:可以通过在滑块行中单击多次或仅通过将滑块按钮拖动到左/右来更改该值


因此,如果用户或您(在本例中)单击按钮,然后将其拖动到所需位置,您将只有一次单击,但拖动会导致多个值更改事件。

首先,我认为这不是编程问题,如果是,我可能还没有很好地理解它

无论如何,请考虑滑块行为:可以通过在滑块行中单击多次或仅通过将滑块按钮拖动到左/右来更改该值


因此,如果用户(在本例中是您)单击按钮,然后将其拖动到所需位置,您将只单击一次,但拖动会导致多个值更改事件。

我尝试重复您的实验,但得到了不同的结果。使用此标记:

<Grid>
    <StackPanel>
        <Slider Minimum="1" Maximum="10" Value="5" ValueChanged="Slider_ValueChanged"/>
    </StackPanel>
</Grid>

完全不单击和不拖动单击不会产生额外的
ValueChanged
事件。因此,我确实看到两个
ValueChanged
事件,但它们发生在启动期间,而不是单击期间。第一个事件是强制位于有效范围内的值,第二个事件是XAML中指定的本地值。

我试图重复您的实验,但得到了不同的结果。使用此标记:

<Grid>
    <StackPanel>
        <Slider Minimum="1" Maximum="10" Value="5" ValueChanged="Slider_ValueChanged"/>
    </StackPanel>
</Grid>

完全不单击和不拖动单击不会产生额外的
ValueChanged
事件。因此,我确实看到两个
ValueChanged
事件,但它们发生在启动期间,而不是单击期间。第一个事件是强制位于有效范围内的值,第二个事件是XAML中指定的本地值。

这可能是因为滑块的模板由拇指和左右两侧组成

表示引发其 从时间开始反复单击事件 将其按下,直到松开为止

如果不需要此功能,则应修改模板并将其从RepeatButtons更改为常规按钮。如果你需要样品,请告诉我


如果您没有Expression Blend,本页可能会帮助您了解组成
滑块的组件。(注意:这是WPF,但Silverlight版本与之类似)

这可能是因为滑块的模板由拇指和左右两侧组成

表示引发其 从时间开始反复单击事件 将其按下,直到松开为止

如果不需要此功能,则应修改模板并将其从RepeatButtons更改为常规按钮。如果你需要样品,请告诉我

如果您没有Expression Blend,本页可能会帮助您了解组成
滑块的组件。(注意:这是WPF,但Silverlight版本类似)

    private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        Debug.WriteLine("ValueChanged: {0} => {1}", e.OldValue, e.NewValue);
    }
ValueChanged: 0 => 1
ValueChanged: 1 => 5