- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简而言之:
在某些情况下,设置 Slider.Minimum 将调整 Slider.Value,尽管当前值大于新的最小值。
代码: (应该是可复制的)
主窗口.xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<DockPanel>
<Slider Name="MySlider" DockPanel.Dock="Top" AutoToolTipPlacement="BottomRight" />
<Button Name="MyButton1" DockPanel.Dock="Top" Content="shrink borders"/>
<Button Name="MyButton2" DockPanel.Dock="Top" VerticalAlignment="Top" Content="grow borders"/>
</DockPanel>
</Window>
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MySlider.ValueChanged += (sender, e) =>
{
System.Diagnostics.Debug.WriteLine("Value changed: " + e.NewValue);
};
System.ComponentModel.DependencyPropertyDescriptor.FromProperty(Slider.MinimumProperty, typeof(Slider)).AddValueChanged(MySlider, delegate
{
System.Diagnostics.Debug.WriteLine("Minimum changed: " + MySlider.Minimum);
});
System.ComponentModel.DependencyPropertyDescriptor.FromProperty(Slider.MaximumProperty, typeof(Slider)).AddValueChanged(MySlider, delegate
{
System.Diagnostics.Debug.WriteLine("Maximum changed: " + MySlider.Maximum);
});
MySlider.Value = 1;
MySlider.Minimum = 0.5;
MySlider.Maximum = 20;
MyButton1.Click += (sender, e) =>
{
MySlider.Minimum = 1.6;
MySlider.Maximum = 8;
};
MyButton2.Click += (sender, e) =>
{
MySlider.Minimum = 0.5;
MySlider.Maximum = 20;
};
}
}
}
Value changed: 1
Minimum changed: 0,5
Maximum changed: 20
//Multiple times "Value changed"
Value changed: 20
Minimum changed: 1,6
Value changed: 8
Maximum changed: 8
Minimum changed: 0,5
Maximum changed: 20
Value changed: 1
Minimum changed: 0,5
Maximum changed: 20
//Multiple times "Value changed"
Value changed: 20
Minimum changed: 1,6
Value changed: 8
Maximum changed: 8
Value changed: 1
Minimum changed: 0,5
Maximum changed: 20
最佳答案
我不确定用例是什么,但是如果您使用的是 MVVM 并且一切都被绑定(bind),这个问题可能可以避免。如果这就是您正在做的事情,而这只是您重现问题的另一种方式,那就太好了。
看看 Slider
source code .我无法查明问题,但我更好地理解了正在使用的内部值。
添加 2 个按钮,并且只更改所有按钮的事件处理程序中的最小值或最大值:
MyButton1.Click += (sender, e) =>
{
MySlider.Minimum = 1.6;
};
MyButton2.Click += (sender, e) =>
{
MySlider.Minimum = 0.5;
};
MyButton3.Click += (sender, e) =>
{
MySlider.Maximum = 20;
};
MyButton4.Click += (sender, e) =>
{
MySlider.Maximum = 8;
};
MyButton1
和
MyButton2
:
Value changed: 1.6
Minimum changed: 1.6
Value changed: 1
Minimum changed: 0.5
Value changed: 1.6
Minimum changed: 1.6
Value changed: 1
Minimum changed: 0.5
Value
属性未更改,因为
Value
在当前范围内:
Maximum changed: 8
Maximum changed: 20
Maximum changed: 8
Maximum changed: 20
Maximum = 8
和
Minimum = 1.6
,
Minimum
现在超出范围(内部)
Value
(1) 并使用
Maximum
它的值(value)是
Value
.当你再次种植它时,你设置
Minimum = 0.5
和
Maximum = 20
,并且由于内部值 = 1 并且介于 0.5 和 20 之间,因此它设置了
Value
回到 1。
Slider.Value
再次。如果您在更改
Maximum
后执行此操作和
Minimum
如果旧值不在新范围内,它将保留该值。因此,以您的初始实现为例:
MyButton1.Click += (sender, e) =>
{
MySlider.Minimum = 1.6;
MySlider.Maximum = 8;
MySlider.Value = MySlider.Value;
};
MyButton2.Click += (sender, e) =>
{
MySlider.Minimum = 0.5;
MySlider.Maximum = 20;
MySlider.Value = MySlider.Value;
};
Value changed: 1
Minimum changed: 0.5
Maximum changed: 20
//Multiple times "Value changed"
Value changed: 20
Minimum changed: 1.6
Value changed: 8
Maximum changed: 8
Minimum changed: 0.5
Maximum changed: 20
Slider
(技术上是
Thumb
和
Track
),意识到
Thumb
左右滑动绑定(bind)到
Slider.Value
通过
Slider.UpdateValue
被调用。现在这个问题是
SetCurrentValueInternal
不是开源的 :( 我们可以得出的结论是神秘函数不会强制
ValueProperty
,而是仅设置基本(“期望”)值。尝试:
private void MyButton1_Click(object sender, RoutedEventArgs e)
{
MySlider.Minimum = 1.6;
MySlider.Maximum = 8;
MySlider.CoerceValue(Slider.ValueProperty); //Set breakpoint, watch MySlider.Value before and after breakpoint.
}
Value
将从 20 下降到 8,当它下降到 8 时您实际上强制 ValueProperty 的第二个,然后该值将更改为
1.6
.事实上,这就是当您扩大范围时会发生的情况。设置 Max 或 Min 后,您将看到 Value 更改,因为它再次强制 value 属性。尝试翻转 Max 和 Min:
private void MyButton2_Click(object sender, RoutedEventArgs e)
{
MySlider.Maximum = 20; //Will change Value to 1.6 after executing
MySlider.Minimum = 0.5; //Will change Value to 1 after executing
}
SetCurrentValueInteral
和
SetValue
双方调用
SetValueCommon
.区别是
SetCurrentValueInternal
由于强制标志设置为 true,因此使用基值重新评估当前值。 (保持最小值/最大值范围内的值),
ref .
SetCurrentValue
和
SetValue
有两个完全不同的结果,即:指定强制转换(在绑定(bind)属性为值类型的情况下,
IsInternal
似乎未使用)。
"The SetCurrentValue method is another way to set a property, but it is not in the order of precedence. Instead, SetCurrentValue enables you to change the value of a property without overwriting the source of a previous value. You can use SetCurrentValue any time that you want to set a value without giving that value the precedence of a local value..."
Thumb
的
Slider
不影响基值,因为它正在调用
SetCurrentValueInternal
.
Value
手动更改基值,因为它调用
SetValue
.
ValueProperty
依赖属性定义了如何使用
CoerceValueCallback
进行强制。如最后一段
here 所述.更详细地了解
Slider.Value
中正在发生的事情,
Coercion interacts with the base value in such a way that the constraints on coercion are applied as those constraints exist at the time, but the base value is still retained. Therefore, if constraints in coercion are later lifted, the coercion will return the closest value possible to that base value, and potentially the coercion influence on a property will cease as soon as all constraints are lifted.
For instance, in the Min/Max/Current scenario, you could choose to have Minimum and Maximum be user settable. If so, you might need to coerce that Maximum is always greater than Minimum and vice versa. But if that coercion is active, and Maximum coerces to Minimum, it leaves Current in an unsettable state, because it is dependent on both and is constrained to the range between the values, which is zero. Then, if Maximum or Minimum are adjusted, Current will seem to "follow" one of the values, because the desired value of Current is still stored and is attempting to reach the desired value as the constraints are loosened.
Slider
中设计的因为它的编码方式是
Value
必须始终介于
Minimum
之间和
Maximum
.
Value
将关注
Maximum
属性,当解除约束(当前值在基值范围内)时,value 属性将返回其原始值。
关于c# - Slider.Value 在不应该调整最小值时发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32053283/
我在使用 Android 时遇到了一点问题。 我有我的 GPS 位置,明确的经纬度,以及以米为单位的搜索射线(例如 100 米),可以吗? 想象一下我在射线形成的圆心的位置,我会知道如何在 Andro
深夜的编程之旅 这是一个深夜,街头灯光昏暗,大部分人都已陷入梦乡。但对于我来说,这却是一个灵感迸发的时刻。窗外的星空仿佛在诉说着某种宇宙的密码,而键盘下的代码则是我解密这个宇宙的工具。 一个突如其来的
我将数据集结构定义为 struct Dataset: Hashable { var x: Double var y: Double } 然后是数组 var dataset: [Data
我在 Excel 文件中有一个摘要选项卡,需要查看应计选项卡才能找到 Max和 Min .我遇到的问题是有许多不同的位置/商品组合,我需要找到 Max和 Min基于位置/商品组合。位置和商品位于两个单
我有一个 Excel 表,其中包含两列感兴趣的年份和捐款。年份值为 2008,2009,2010 等... 我想获得 2009 年所有捐款中的最低金额。我试过了 MIN(IF(Year="2009",
到现在为止,我刚刚找到了为列表中多个数据帧中的列获取最大值的解决方案。 我已经将数据帧 df1, df2, df3, ..., dfn 存储在列表 dfList 中,我想获取列 df_ 的最大值$a
假设我有一个列名列表作为向量: vec=c("C1" , "C2" ,"C3"). 我知道这些列名来自数据框 df: df: C1 C2 C3 C4 C5 1 2 3 4 5 1 4
我需要计算大数组的最小值/最大值。我知道Math.max.apply() ,但在大型数组上,它会因堆栈溢出异常而失败。有什么简单的解决方案吗? 最佳答案 使用 sort() 对数组进行排序方法它使用快
例如,我有一个像这样的模型: class Record(models.Model): name = CharField(...) price = IntegerField(...)
我正在编写一个用于测试听力的简单应用,并且正在使用Audiotrack生成纯音。因为它是用于测试听力的应用程序,所以我使用非常低的音量来播放这些音调。 要设置音量,我使用音轨的 setVolume(f
Example data set 对,上面是我的数据集子段图像的链接。它以 3 列为一组,第一个是浓度,第二个是限定值,最后一个是 MDL - 并持续最多 95 个 sample (因此总共 285
我想计算 df 的每 n 行的最小值/最大值,比如 10,但是使用 df.rolling(10).max() 给出第 0-9、1-10、2-11 行的值等。我想要 0-9、10-19、20-29 等
我被问到了关于 c# 的同样问题 here我发现通过使用 linq 你可以轻松地做到这一点。 但是既然 java 中的 linq 没有其他选择,我该如何简单地做到这一点呢? 最佳答案 如果您想要类似于
我曾经使用过数组,并且知道如何对使用数值(double 和 int)的数组进行排序,但我必须使用字符串数组制作相同的应用程序。我的教授不允许我发挥“创造力”,也不允许我与其他可能有助于完成这项工作的静
我想知道通过这样的回溯获得某些事实的最大值(最年长的人)是否是个好主意: data(MaxID, MaxName, MaxAge), \+ (data(ID, Name, Age), ID \= Ma
我想计算 df 的每 n 行的最小值/最大值,比如 10,但是使用 df.rolling(10).max() 给出第 0-9、1-10、2-11 行的值等。我想要 0-9、10-19、20-29 等
我的数据如下所示: df <- tribble( ~A, ~B, 0.2, 0.1, 0.2, 0.3, 0.5, 0.1, 0.7, 0.9,
我有以下数据集 Date Category 2014-01-01 A 2014-01-02 A 2014-01-03 A 2014-01-04
我是使用 Python 进行数据分析的初学者,并且坚持以下几点: 我想使用广播/矢量化方法从各个列 (pandas.dataframe) 中找到最大值(value)。 我的数据框的快照如下: 最佳答案
C99 中是否有一个标准函数来使用给定的比较函数获取给定数组中的最小/最大元素。 类似: void* get_min(void* start,size_t size,size_t elementSiz
我是一名优秀的程序员,十分优秀!