2014-05-20 58 views
0

我試圖從視圖模型將焦點設置一定的UIElement依賴的對象要做到這一點我已經寫了一個附加的依賴項屬性如下:設置焦點從視圖模型不能正常工作

#region IsFocusedProperty 
    public static readonly DependencyProperty IsFocusedProperty = 
     DependencyProperty.RegisterAttached("IsFocused", typeof(bool), typeof(AttachedProperties), 
     new FrameworkPropertyMetadata(false, 
      new PropertyChangedCallback(OnIsFocusedChanged))); 

    private static void OnIsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var obj = d as UIElement; 

     var oldValue = (bool)e.OldValue; 
     var newValue = (bool)e.NewValue; 

     if (oldValue != newValue && !obj.IsFocused) 
     { 
      obj.Focus(); 
     } 
    } 

    public static void SetIsFoused(UIElement element, bool value) 
    { 
     element.SetValue(IsFocusedProperty, value); 
    } 

    public static bool GetIsFocused(UIElement element) 
    { 
     return (bool)element.GetValue(IsFocusedProperty); 
    } 
    #endregion 

我應該說它工作並將焦點發送到指定的元素,除非當我將鼠標光標移動到視圖中的每個元素(包括焦點所在的指定元素)上時,沒有鼠標事件觸發。我這樣說是因爲我已經爲元素的IsMouseOverProperty編寫了觸發器,但是當焦點以這種方式發送到指定的元素時,會出現未觸發事件。

我也應該說觸發器再次正常工作,當我點擊視圖上的任何地方。我真的不知道問題是什麼?請分享你的想法。任何想法將不勝感激。提前致謝。

編輯: 我已經想通了,該元素獲得鍵盤焦點,但顯然不是邏輯焦點,因爲當我將光標移動到前一個元素,它仍然觸發MouseMove事件。

我還不確定是什麼問題?

回答

0

更新到:

if (oldValue != newValue && !obj.IsFocused) 
{ 
    Dispatcher.BeginInvoke(DispatcherPriority.Input, 
     new Action(delegate() 
     { 
      obj.Focus();   
      Keyboard.Focus(obj); 
     }) 
    ); 
} 
+0

謝謝@ d.moncada但它仍然無法正常工作。 – user3530012