c# - 如何获取托管在 ContentControl 中的 UserControl 的父级?
问题描述
在 WPF 应用程序中,我有一个ContentControl
. 在这个 ContentControl 中,我有一个View
.
从一个特定的开始UserControl
,我试图在它的逻辑树中向上,并在途中“激活”每个组件。例如,如果一个父母是 a Tab
,我通过示例选择它。
我的问题是,当我UserControl
在 aContentControl
中时,当我调用时,LogicalTreeHelper.GetParent(...)
我收到 null:
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);
推荐阅读
- fortran - 打印与 gdb 中的内置类型同名的 Fortran 变量
- python - Webscraping:在循环中用 0 替换 None 值
- python - kedro:使用 keras ImageDataGenerator 训练图像分类器
- python - 向openpyxl趋势线添加“线性”以外的趋势线类型会导致错误
- r - dplyr 函数内部行为不一致
- spring-boot - spring.profiles.include 不能与 spring 云配置服务器一起使用?
- reactjs - 如何在 redux 中处理多个输入值?
- html - 直接在源标签中使用媒体或宽度的区别
- c# - 在 OpenAPI / Swagger 中按名称排序方法
- r - R - 有条件的替换