Найти родительский элемент управления внутри ContentPresenter - PullRequest
0 голосов
/ 28 мая 2018

Вот мой код, который я пытаюсь найти родительским «NodeItem» из дочернего элемента управления, который находится внутри предъявителя контента.

private static DependencyObject GetParentObject(DependencyObject child)
        {
            if(child == null)
            {
                return null;
            }

            var result = child as NodeItem;
            if (result != null)
            {
                return result;
            }

            ContentElement contentElement = child as ContentElement;
            if(contentElement != null)
            {
                DependencyObject parent = ContentOperations.GetParent(contentElement);
                if(parent != null)
                {
                    return GetParentObject(parent);
                }
            }

            FrameworkElement fe = child as FrameworkElement;
            if(fe != null)
            {
                DependencyObject parent = fe.Parent;
                if(parent != null)
                {
                    return GetParentObject(parent);
                }
            }
            return GetParentObject(VisualTreeHelper.GetParent(child));
        }

А вот визуальное дерево из snoop.

снимок экрана визуального дерева

Я обработал OnDrop для метки и хочу получить доступ к узлу узла из этого обработчика события.

здесь XAML

<Grid>
                        <!--
                            This border indicates that node is selected.
                            Normally it is transparent, but when 'IsSelected' is set
                            to 'true' the border brush becomes blue and its background
                            becomds light blue.
                        -->
                        <Border
                            x:Name="selectionBorder"
                            Margin="{TemplateBinding Margin}"
                            Padding="{TemplateBinding Padding}"
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            CornerRadius="2">
                            <Border.Style>
                                <Style>
                                    <Setter Property="Control.Effect">
                                        <Setter.Value>
                                            <DropShadowEffect
                                                Opacity="0.1"
                                                ShadowDepth="1"
                                                Color="#FF151414" />
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </Border.Style>

                            <!--
                                User-defined node content is presented here.
                            -->
                            <ContentPresenter />

                        </Border>

                    </Grid>

Content Presenter позднее заменяется другой сеткой с элементами управления, отображаемыми в дереве.

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Ошибка в предыдущем примере кода, исправлена ​​ниже:

private T FindParent<T>(DependencyObject child) where T : DependencyObject
{
  DependencyObject immediateParent = VisualTreeHelper.GetParent(child);
  T parent = immediateParent as T;
  if (parent != null)
    return parent;
  else
    return FindParent<T>(immediateParent);
}
0 голосов
/ 29 мая 2018

Ответ по ссылке https://social.msdn.microsoft.com/Forums/vstudio/en-US/c47754bd-38c7-40b3-b64a-38a48884fde8/how-to-find-a-parent-of-a-specific-type?forum=wpf.

private T FindParent<T>(DependencyObject child)    
where T : DependencyObject    
{    
   T parent = VisualTreeHelper.GetParent(child) as T;    
   if (parent != null)
   {
      return parent;
   }
   else
   {
      return FindParent<T>(parent);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...