WPF控件初始化的序列 - IsEnabled

时间:2015-12-11 20:56:12

标签: c# wpf initialization

我正在查看一个问题,即在我的代码完全初始化并准备好处理之前,我在启动程序时立即在滑块上获取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不同。所以我按照上面的说法切换了顺序,这对问题没有任何影响。

2 个答案:

答案 0 :(得分:0)

尝试在IsEnabled="False"分配之前移动Maximum="200" 。在XAML中有一种赋值顺序而不是XML。

  

是的顺序可以解决问题。考虑到XAML读取涉及对象的创建以及对这些对象的属性的值的赋值。它不可能同时分配属性值,显然将分配一个属性,然后分配另一个属性,然后分配另一个属性,直到分配所有属性。

更新

ValueRangeBase.Value依赖属性的包装属性 在RangeBase.OnValueChanged事件处理程序中注册。

正如您所看到的那样,它附加了RangeBase.OnValueChanged事件处理程序,因此IsEnabled不会对此事件处理程序调用产生影响。

我建议你在初始化后将事件处理程序赋值转移到类构造函数中。

设置MaximumMinimum属性为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
}