[英]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讀取涉及對象的創建以及這些對象的屬性的值分配。 不可能同時分配屬性值,顯然要分配一個屬性,然后分配另一個,然后分配另一個,直到分配了所有屬性。
更新:
Value
是RangeBase.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.