在 WPF 应用程序中,我有一个ContentControl
.在这个内容控件中,我有一个View
。
从一个特定的UserControl
开始,我试图进入它的逻辑树,并"激活"过程中的每个组件。例如,如果父母一方是Tab
,我通过示例选择它。
我的问题是,当我的UserControl
在ContentControl
中时,当我调用LogicalTreeHelper.GetParent(...)
时,我会收到空:
private static void Activate(FrameworkElement frameworkElement)
{
//Here, in one iteration, I receive null when it's supposed to be the `ContentControl`.
DependencyObject parent = LogicalTreeHelper.GetParent(frameworkElement);
if (parent is FrameworkElement parentFrameworkElement)
{
Activate(parentFrameworkElement);
}
if (frameworkElement is DXTabItem tab)
{
tab.IsSelected = true;//If it's a tab, it gets activated
}
frameworkElement.Focus();
}
我的 Xaml 是这样的:
<dx:DXTabControl AllowMerging="True" TabContentCacheMode="None" Margin="0,3,0,0">
<dx:DXTabItem Header="Some channel">
<local:SomeControl Channel="{Binding Channel}"/>
</dx:DXTabItem>
<dx:DXTabItem Header="Some other view">
<ContentControl Content="{Binding Channel, Converter={StaticResource SomeModelToViewModelConverter}}" ContentTemplateSelector="{StaticResource ConventionBasedDataTemplateSelector}" />
</dx:DXTabItem>
</dx:DXTabControl>
所以:知道如何从其中的控件获取ContentControl
吗?
编辑这似乎与控件位于未选中的选项卡中这一事实有关(我的功能的目标是激活绑定到某些内容的用户控件所在的选项卡(。
假设元素已加载并添加到可视化树中,则可以使用以下递归方法来查找父元素:
private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
var parent = VisualTreeHelper.GetParent(dependencyObject);
if (parent == null) return null;
var parentT = parent as T;
return parentT ?? FindParent<T>(parent);
}
示例用法:
DXTabItem parent = FindParent<DXTabItem>(frameworkElement);