代码之家  ›  专栏  ›  技术社区  ›  Suplanus

WPF扩展工具包属性网格:选择属性

  •  1
  • Suplanus  · 技术社区  · 9 年前

    propertyGrid.Focus();
    propertyGrid.SelectedProperty = propertyGrid.Properties[0];
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    不幸的是,似乎没有内置的解决方案。

    我建议的解决方案更像一个变通方法,但它应该正确地可视化选择 SelectedProperty 如果设置为codebehind。

    首先,我们需要一些 扩展 :

     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