簡體   English   中英

WPF控件初始化的順序-IsEnabled

[英]Sequence of WPF control initialization - IsEnabled

我正在查看一個問題,在我的程序完全初始化並准備對其進行處理之前,當我啟動程序時,會立即從滑塊上獲取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,為什么它會一直觸發事件呢?

編輯:在我的帖子的原始版本中,我在XAML中分配了處理程序設置了IsEnabled =“ False”,有些人認為這是由於XAML涉嫌對求值順序敏感而導致的問題,與XML不同。 因此,如上所述,我切換了順序,這對問題沒有影響。

嘗試在Maximum="200"分配之前移動IsEnabled="False" XAML中有一種分配順序,而不是XML。

是的,順序很重要。 考慮到XAML讀取涉及對象的創建以及這些對象的屬性的值分配。 不可能同時分配屬性值,顯然要分配一個屬性,然后分配另一個,然后分配另一個,直到分配了所有屬性。

更新:

ValueRangeBase.Value依賴項屬性的包裝屬性, RangeBase.Value屬性已在RangeBase.OnValueChanged事件處理程序中注冊。

如您所見,它附加了RangeBase.OnValueChanged事件處理程序,因此IsEnabled不會對此事件處理程序調用產生影響。

我建議您在初始化后將事件處理程序分配移至類構造函數中。

設置“ Maximum或“ Minimum屬性將強制“ Value屬性,因此將調用值更改事件處理程序。

使用布爾標志使事情保持簡單:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM