本文介绍了Slider.Value关于调整变化最小的时候它不应该的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 简而言之:结果在某些情况下设置Slider.Minimum将调整Slider.Value虽然目前的值越大,则新的最低 代码:(应该是可重复的)结果的 MainWindow.xaml:的 <窗口x:类=WpfApplication1.MainWindow的xmlns =http://schemas.microsoft.com/winfx/2006/xaml/presentation 的xmlns:X =http://schemas.microsoft.com/winfx/2006/xaml标题=主窗口HEIGHT =350WIDTH =525> <&DockPanel中GT; <滑块NAME =MySliderDockPanel.Dock =评出的AutoToolTipPlacement =BottomRight/> <按钮名称=MyButton1DockPanel.Dock =评出的CONTENT =缩水边界/> <按钮名称=MyButton2DockPanel.Dock =评出的VerticalAlignment =评出的CONTENT =增长边界/> < / DockPanel中> < /窗GT; 的 MainWindow.xaml.cs:的 使用System.Windows;使用System.Windows.Controls的; 命名空间WpfApplication1 {公共部分类主窗口:窗口 {公共主窗口() {的InitializeComponent() ; MySlider.ValueChanged + =(发件人,E)=> { System.Diagnostics.Debug.WriteLine(值改为:+ e.NewValue); }; System.ComponentModel.DependencyPropertyDescriptor.FromProperty(Slider.MinimumProperty的typeof(滑块))。AddValueChanged(MySlider,代表 { System.Diagnostics.Debug.WriteLine(最低改为:+ MySlider.Minimum); }); System.ComponentModel.DependencyPropertyDescriptor.FromProperty(Slider.MaximumProperty的typeof(滑块))。AddValueChanged(MySlider,代表 { System.Diagnostics.Debug.WriteLine(最大改为:+ MySlider.Maximum); }); MySlider.Value = 1; MySlider.Minimum = 0.5; MySlider.Maximum = 20; MyButton1.Click + =(发件人,E)=> { MySlider.Minimum = 1.6; MySlider.Maximum = 8; }; MyButton2.Click + =(发件人,E)=> { MySlider.Minimum = 0.5; MySlider.Maximum = 20; }; } } } 重现步骤:结果 1.在调试模式下搜索 2.将滑块移动到最右边的结果 3.按缩水边框按钮运行。结果 4.按增长边界按钮。 预期输出: 值改变:1 最小变化:0,5 最大改变:20 //多次值改为值改为:20 最小变化:1, 6 值改为:8 最大改变:8 最小变化:0,5 最大改变:20 滑块保持在8 实际输出: 值改为:1 最小变化:0,5 最大改变:20 //多次的价值改为值改为:20 最小变化:1,6 值改为:8 最大改变:8 值改为:1 最低值变:0,5 最大改变:20 (注意额外的值改为:1 )结果滑块跳转到1 旁注:结果结合Slider.Value OneWayToSource (或双向),以双重属性,修复该问题。 问:结果为什么会这样? / p> 理论:结果我敢肯定它是与的Value强制。这似乎是发生以下情况:结果 1.设置值1的程序化设定值的基准值。它 2.设置最小和最大不会改变任何东西,因为值仍处于两者之间。 > 3.手动拉动滑块向右显然改变了有效价值,但对于一些奇怪的原因,不是基值。结果 4.再次增加边框,来电胁迫回调,实现,即(错误)基本价值是新的最小值和最大值之间,并改变了有效价值回去吧。 假设这是的确发生了什么,使我们的以下问题:?搜索为什么手动拉动滑块(3)不影响基值 解决方案 我不知道该用例是什么,但很可能如果你使用MVVM和避免这个问题一切都被约束。如果这是你在做什么,这只是你再现问题,善于发现的另一种方式。 看看的的 滑块源代码。我不能确定的问题,但我有一个更好的了解,有正在使用的内部价值。 添加2个按钮,只更改最小或最大的事件处理程序的所有按钮: MyButton1.Click + =(发件人,E)=> { MySlider.Minimum = 1.6; }; MyButton2.Click + =(发件人,E)=> { MySlider.Minimum = 0.5; }; MyButton3.Click + =(发件人,E)=> { MySlider.Maximum = 20; }; MyButton4.Click + =(发件人,E)=> { MySlider.Maximum = 8; }; 在启动时,点击 MyButton1 和 MyButton2 : 值改为:1.6 最小变化:$ 1.6 b $的b值变化:1 最小变化:0.5 值改为:1.6 最小变化:1.6 值改为:1 最小变化:0.5 您可以看到,在内部,它存储原始起始值,当范围是能够显示它的恢复它,它设置它回到它是什么。如果你只改变最大的在启动时(没有移动滑块),则值属性没有改变,因为值在当前范围: 最大改变:8 最大改变:20 最大改变: 8 最大改变:20 然而,当你滑块最大变化为20,然后更改最大值= 8 和最小值= 1.6 的最小现在出的范围(内部)值(1),并使用最高价值为它的值。当你再次增长,你设置最小值= 0.5 和最大值= 20 ,而且由于内在价值= 1在0.5至20之间,它集值回1。 我找到了一个解决办法,那就是重置每次改变时间范围内在价值。要重置,你只要设置再次 Slider.Value 。如果你以后做更改最高和最小将坚持事件的旧值ISN'的值吨新范围范围。所以,把你的初始实现: MyButton1.Click + =(发件人,E)=> { MySlider.Minimum = 1.6; MySlider.Maximum = 8; MySlider.Value = MySlider.Value; }; MyButton2.Click + =(发件人,E)=> { MySlider.Minimum = 0.5; MySlider.Maximum = 20; MySlider.Value = MySlider.Value; }; 输出(符合您的预期): 值改为:1 最小变化:0.5 最大改变:20 //多次值改为$ b $的b值改为:20 最小变化:1.6 值改为:8 最大改变:8 最小变化:0.5 最大改变:20 修改 在公布有关价值胁迫的链接是很有帮助。我不知道,如果你的问题会被认为是第二个问题,但我相信我找到了答案。 当您使用滑块(技术上的拇指与跟踪),实现了拇指左右滑动通过的 Slider.Value e804f0ead88d96c9.html相对=nofollow> Slider.UpdateValue 被调用。这个问题现在是 SetCurrentValueInternal 不是开源:(我们可以断定的是,神秘的功能不强迫 ValueProperty ,相反它只是设置基地(理想)值尝试: 私人无效MyButton1_Click(对象发件人,RoutedEventArgs E) { MySlider.Minimum = 1.6; MySlider.Maximum = 8; MySlider.CoerceValue(Slider.ValueProperty); //设置断点,前观看MySlider.Value之后断点。} 做好以上,你会看到,即使值从20下降到8,第二你居然强制转换ValueProperty当它下降到8,该值将然后换 1.6 事实上,这就是当你长大的范围内发生的事情在设置最大值或最小值,你会看到值的变化,因为它再次强迫值属性尝试翻转最大和最小: 私人无效MyButton2_Click(对象发件人,RoutedEventArgs E) { MySlider.Maximum = 20; //执行 MySlider.Minimum = 0.5后,将值更改为1.6; //执行} 后,将值更改为1 不过,这让你觉得,它怎么能记得回去的时候1可能的,是有一个有效的,基地,初始值?我不知道。 说实在的,试试这个。 开始应用 将拇指一路向右(值= 20) 收缩边界(值= 8) 以拇指和其移动到左侧,然后一路向右(值= 8) 然后成长边界 第5步之后,你会发现,价值仍然等于8。这是我的发现,它的东西,与神秘的功能做的。 请注意:我的大脑已经死亡了,所以如果这是不明确的,我道歉,我会回来,并进行修改 编辑2 有关一体,既 SetCurrentValueInteral 和的SetValue 这两个叫 SetValueCommon 。所不同的是 SetCurrentValueInternal 重新评估与基值电流值,因为裹胁标志设置为真。 (保持在边界最小/最大的值),裁判。 通过我挖,我发现 SetCurrentValue 和的SetValue 有两个完全不同的结果,那就是:指定胁迫( IsInternal 似乎是在绑定属性是值类型的情况下,未使用)。 我的证据是的文档指出: With that being said, moving the Thumb of the Slider doesn't effect the base value because it is calling SetCurrentValueInternal. Moreover, changing the Value manually changes the base value because it calls SetValue. The ValueProperty dependency property defines how to coerce using the CoerceValueCallback as stated in the last paragraph here. In more detail of what's going on in Slider.Value,Of course I read further, Dependency Property Callbacks and Validation - Advanced Coercion and Callback Scenarios and found this:In conclusion, I think this is as-designed in Slider because it is coded in such a way that Value must always be in between Minimum and Maximum. The Value will follow the Maximum property, and when constraints are lifted (the current value is in range of the base value) the value property will return to its original value.Lastly, IMO WPF designed the slider this way because WPF goes hand in hand with data binding. I assume they designed under the assumption that developers would take full advantage of data-binding and would implement the logic to prevent invalid values from being used. 这篇关于Slider.Value关于调整变化最小的时候它不应该的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!
09-27 15:02