我正在查看一个问题,即在我的代码完全初始化并准备好处理之前,我在启动程序时立即在滑块上获取ValueChanged事件。
滑块的XAML是
<Slider Name="ZoomSlider" HorizontalAlignment="Left" Margin="930,191,0,0" VerticalAlignment="Top"
Width="212" Height="30" TickPlacement="BottomRight" TickFrequency="2" Maximum="200"
Minimum="12" IsEnabled="False" Value="50" ValueChanged="ZoomSlider_ValueChanged" />
...请注意,IsEnabled设置为False。
但是在事件处理程序中,如果我询问控件的状态,则返回true。 。 。
private void ZoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
var slider = sender as Slider;
bool b = ZoomSlider.IsEnabled; // says TRUE!
double value = slider.Value; // retrieve value
GlobalZoom = value / 50;
}
只要在我的主窗口初始化代码中调用 InitializeComponent(),就会调用该事件,但是当它从该调用返回时,IsEnabled将返回false。事实上,如果我执行F11并尝试进入 InitializeComponent()调用,它会立即转到ValueChanged事件处理程序。
. . .
InitializeComponent();
bool b = ZoomSlider.IsEnabled; // says FALSE!
. . .
所以我很困惑。如果我在XAML中将它设置为false,为什么它是真的并且触发事件?
编辑:在我的帖子的原始版本中,我设置了IsEnabled =&#34; False&#34; 之后在XAML中分配处理程序,并且有些人认为这导致问题是由于XAML涉嫌对评估顺序敏感,与XML不同。所以我按照上面的说法切换了顺序,这对问题没有任何影响。
答案 0 :(得分:0)
尝试在IsEnabled="False"
分配之前移动Maximum="200"
。在XAML中有一种赋值顺序而不是XML。
是的顺序可以解决问题。考虑到XAML读取涉及对象的创建以及对这些对象的属性的值的赋值。它不可能同时分配属性值,显然将分配一个属性,然后分配另一个属性,然后分配另一个属性,直到分配所有属性。
更新
Value
是RangeBase.Value
依赖属性的包装属性
在RangeBase.OnValueChanged
事件处理程序中注册。
正如您所看到的那样,它附加了RangeBase.OnValueChanged
事件处理程序,因此IsEnabled
不会对此事件处理程序调用产生影响。
我建议你在初始化后将事件处理程序赋值转移到类构造函数中。
设置Maximum
或Minimum
属性为coercing Value
属性,因此会调用值更改事件处理程序。
答案 1 :(得分:0)
使用布尔标志来保持简单:
privat bool initializing = false;
public MainWindows()
{
initializing = true;
InitializeComponent();
initializing = false;
}
private void ZoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if ( initializing )
return;
//Normal flow
}