2016-09-01 78 views
0

我想將焦點設置在屬性網格的第一個項目。因此,在添加一個對象並將其綁定到PropertyGrid後,您可以更改第一個屬性。WPF擴展工具包的PropertyGrid:選擇房產

我嘗試這樣做,但不工作:

propertyGrid.Focus(); 
propertyGrid.SelectedProperty = propertyGrid.Properties[0]; 

回答

1

遺憾的是,似乎是沒有內置解決這個。

我建議的解決方案更像是一個解決辦法,但如果它被隱藏代碼上設置應適當視覺 - 選擇SelectedProperty

首先,我們需要一些擴展

public static class Extensions { 
    public static T GetDescendantByType<T>(this Visual element) where T : class { 
     if (element == null) { 
     return default(T); 
     } 
     if (element.GetType() == typeof(T)) { 
     return element as T; 
     } 
     T foundElement = null; 
     if (element is FrameworkElement) { 
     (element as FrameworkElement).ApplyTemplate(); 
     } 
     for (var i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) { 
     var visual = VisualTreeHelper.GetChild(element, i) as Visual; 
     foundElement = visual.GetDescendantByType<T>(); 
     if (foundElement != null) { 
      break; 
     } 
     } 
     return foundElement; 
    } 

    public static void BringItemIntoView(this ItemsControl itemsControl, object item) { 
     var generator = itemsControl.ItemContainerGenerator; 

     if (!TryBringContainerIntoView(generator, item)) { 
     EventHandler handler = null; 
     handler = (sender, e) => 
     { 
      switch (generator.Status) { 
      case GeneratorStatus.ContainersGenerated: 
       TryBringContainerIntoView(generator, item); 
       break; 
      case GeneratorStatus.Error: 
       generator.StatusChanged -= handler; 
       break; 
      case GeneratorStatus.GeneratingContainers: 
       return; 
      case GeneratorStatus.NotStarted: 
       return; 
      default: 
       break; 
      } 
     }; 

     generator.StatusChanged += handler; 
     } 
    } 

    private static bool TryBringContainerIntoView(ItemContainerGenerator generator, object item) { 
     var container = generator.ContainerFromItem(item) as FrameworkElement; 
     if (container != null) { 
     container.BringIntoView(); 
     return true; 
     } 
     return false; 
    } 

    } 

在此之後,你可以很容易地做到以下幾點:

//Register to the SelectedPropertyItemChanged-Event 
this._propertyGrid.SelectedPropertyItemChanged += this.PropertyGridSelectedPropertyItemChanged; 
//Set any Property by index 
this._propertyGrid.SelectedProperty = this._propertyGrid.Properties[3]; 

最後做的神奇突出

private void PropertyGridSelectedPropertyItemChanged(object sender, RoutedPropertyChangedEventArgs<PropertyItemBase> e) { 
     var pic = this._propertyGrid.GetDescendantByType<PropertyItemsControl>(); 
     pic.BringItemIntoView(e.NewValue); 
     // UPDATE -> Move Focus to ValueBox 
     FocusManager.SetFocusedElement(pic,e.NewValue); 
     var xx = Keyboard.FocusedElement as UIElement; 
     xx?.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
    } 

關閉

這裏的一切的關鍵是,知道PropertyItemsControl這是一個ItemsControl控制所有的屬性。

希望這會有所幫助!

現金

Bring ItemsControl into view
Get Nested element from a Control

+0

這工作,但仍有一個問題: – Suplanus

+0

該項目被選中,但我不能直接設置由鍵盤上輸入數值,不得不按TAB鍵,所以我可以編輯 – Suplanus

+0

@Suplanus伊夫修改我的代碼以符合您的需求。現在價值箱已經集中並準備好輸入 – lokusking

相關問題