问题标签 [logical-tree]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
326 浏览

c# - 视觉和逻辑树遍历不检索几个级别

我正在从同一个应用程序中探索逻辑树和可视树,但没有成功深入各个级别。

我的代码使用通用资源管理器:

ProcessLogicalTree并简单地迭代(在重新调用ProcessVisualTree之前做一些事情)。ProcessGenericTree

结果看起来很完整,但是当我尝试将 a 检索TextBlockGridViewColumnHeader 中时,看起来该项目既不存在于 Logical 中,也不存在于 Visual 的叶子列表中FrameworkElement

它似乎是一个视觉元素变成一个逻辑元素。事实上,添加一个手表,这TextBlock出现在我的Visual ChildrenGridView(检索为合乎逻辑,它处于Tab Item未选中状态),但我的代码并非无法获取它。

我的电话很简单:

其中 root 是主窗口。

那么,我怎样才能在最深层次上探索我的树呢?也许重新遍历检索到的FrameworkElement列表?我认为我的 ProcessGeneric 代码已经做到了。

更新:WPF Visualizer 显示了这种结构:

GridViewColumnHeader级别包含我TextBlock的,但视觉树不包含。

更新2:使用从主窗口开始的递归,我的元素可见我无法使用以下代码查找具有指定名称的对象:

我很确定VisualTreeHelper无法检索 Header 属性中的元素,但WPF Inspector工作正常。

我想知道它是否使用不同的方法来遍历树(也许也检查Properties类似的方法Header)。建议?

0 投票
1 回答
691 浏览

wpf - 将逻辑树外部的 DependencyObject 绑定到逻辑树中的元素的属性

已编辑

问题总结:

我有一个自定义控件,它有一个ObservableCollectionof DependencyObjects。因为DependencyObjects 不是控件的子控件,所以它们不在逻辑树中。但是,我需要它们使用 XAML 绑定到逻辑树中元素的属性。(我不能使用代码隐藏。)我尝试使用Source={x:Reference blah},但由于周期性依赖限制,我无法使用它。

有谁知道我如何将DependencyObjects 添加到逻辑树?或者有没有人有任何其他想法如何解决这个问题?

细节:

我正在开发一个自定义ComboBox. 我希望我的一个es根据同一窗口上ComboBox其他es中选择的值过滤可见的项目。ComboBox

例子:

一个ComboBox显示存储在我的数据库中的产品列表,另一个显示产品类型。我希望第二个ComboBox在选择项目时过滤第一个的可见项目,我希望第一个ComboBox过滤可见项目并设置第二个的值。

由于我设置“ProductTypes”表的方式,“typeName”字段不是唯一的,所以如果我希望我ComboBox只显示产品类型的唯一名称,那么我必须使用dataTable.DefaultView.ToTable(unique: true, column: "typeName").DefaultView.

代码:

customComboBox有一个ObservableCollectionofFilterBinding对象,它绑定到其他ComboBoxes 的选定值。这是FilterBinding课程:

这是我的自定义代码ComboBox。它实际上继承自 Telerik 的RadComboBox,但它的行为非常像普通的ComboBox

这是 XAML:

但是,它不会绑定 FilterBindings,因为 ElementName 仅适用于逻辑树中的元素。

我不使用 MVVM。相反,我得到了一个DataTable通过 SQL。最终我将使用 EntityFramework,但它不会改变ItemsSource将分配给DataView从 LINQ 派生的事实。我需要使用的原因DataView是因为有时DisplayMemberPath会引用具有非唯一条目的列,这些条目需要在ComboBox.

0 投票
1 回答
1400 浏览

wpf - 如何在发布中调试“指定元素已经是另一个元素的逻辑子元素”

我知道我应该用代码示例发布一个非常具体的问题,但我不知道从哪里开始:

在 Visual Studio 中运行我的应用程序时,在调试和发布模式下都可以。但是,当我创建 InstallShield 安装程序时,在其他计算机上出现异常:

System.Windows.Threading.Dispatcher WPF 指定元素已经是另一个元素的逻辑子元素。先断网

我在 StackOverflow 和其他网站上看到了大量关于这个问题的帖子,但没有任何参考资料表明这只发生在已安装的包中。

我的问题是双重的(也很抱歉):

  1. 我怎么可能调试这样的问题?我的意思是,特别是如果可能的话(不是通用的运行时调试)
  2. 我可以捕获什么样的异常来提供有关错误的更多信息?我正在显示一个显示 ReflectionTypeLoadException 的 MessageBox。我很想知道哪个元素是具有“双亲”或“双子”的元素。

更复杂的是,该应用程序在我用于开发的计算机上运行良好,但在其他计算机(例如,我父亲和姐姐的计算机)中出现此异常时崩溃。

任何线索都将受到赞赏和应有的赞成。谢谢

- - - - - - - - - - - - - - - - - -编辑 - - - - - - - ----------------------

我设法将麻烦的孩子逼到了 ListView 的 ItemTemplate 中名为“textAvisosSeccion”的 TextBlock:

查看绑定 Text="{Binding Value.Avisos}"。ListView 绑定到使用 MEF 导入的集合Lazy<T>,其中 T 具有“Avisos”属性。另一个 TexkBlock 绑定到Lazy<T>的元数据,这很好。

除了我绑定到惰性值的原因(实例化对象,失去惰性的优势)之外,为什么我会因为这个而得到“指定元素已经是另一个元素的逻辑子元素”异常?!?!?

“Avisos”属性只是 ViewModel 中的一个整数(不是从 UIElement 继承的)。

编辑#2:

VS2012 中没有抛出类似这个和其他异常(样式问题、MEF 组合问题等),因为它安装了 .NET Framework 4.5 的计算机。即使所有项目都针对 Framework 4.0。

如果你正在为 4.0 开发,请使用 Vista 的旧机器,确保你已安装 4.0 并使用 VS2010;这是确保的唯一方法。

0 投票
4 回答
28529 浏览

c# - 从 WPF 中的任何/未指定的父容器断开元素

我有一个控件是另一个控件的子控件(因为所有非根控件/元素都在 WPF 中)。如果我想将控件移动到另一个容器,我必须先将它与当前容器断开连接(否则会引发异常)。

如果我知道父母是什么,那么我可以将其从其 Children 集合或 Content 或其他内容中删除。但是如果我不知道父容器的类型是什么——那我该如何移除子控件呢?

在下面的代码示例中:如何在不知道父级(面板、组框...)的类型的情况下将“sp1”移动到另一个容器?

理想情况下,我只想写一些类似的东西:

但我还没有找到类似的东西。

0 投票
1 回答
751 浏览

c# - 为自定义控件构建逻辑树

我正在开发一个控件,ObservableCollection它的DependencyProperties. 此属性设置DefaultProperty为我的控件,因此我可以通过构造类似于以下内容的行将项目隐式添加到 XAML 中的集合中:

据我了解,WPF 引擎在解析 XAML 时会构建逻辑树。因此,每个都MyItem应该是MyControl. 相反,MyControl应该是每个 的逻辑父级MyItem

好吧,显然还有更多。下面是我用来定义上述关系的代码。自定义控件包含一个DependencyPropertyforObservableCollection并且它由一个 CLR 属性支持。

MyItem(继承FrameworkContentElement)开始,我尝试像这样访问它的逻辑父级:

令我惊讶的是,父控件永远不会重新呈现。这是因为该MyItem.Parent属性为空。为什么是这样?

我如何指示 WPF 引擎知道它MyControl应该是逻辑父级MyItem

0 投票
2 回答
203 浏览

c# - 使用逻辑父函数

也许我的问题完全是愚蠢的,但我正在努力做到最好。

我想做的就是使用父元素的函数/属性。

我准备了一个没有意义的简单示例:

谢谢!

编辑:我想我必须为您提供更多信息。

我的用户能够将值拖到画布上。我的画布在父类的列表中。现在我的画布想知道列表中的任何其他画布是否已经具有相同的值。

我的实现想法:

用户进行拖动 --> Canvas 得到一个事件 --> Canvas 询问父类是否有任何其他 Canvas 已经具有相同的值 --> 决定做什么。

明天我会发布一个更详细的例子!

0 投票
0 回答
44 浏览

c# - 解析内容控制中的视觉元素:查看模型问题

我想要一个干净的解决方案来解决我遇到的一个小问题:我有一个标准的主页视图及其视图模型,在视图内我显示一个用户控件(Dossier)及其视图模型(DossierViewModel)。

为了从主视图模型动态实例化我的视图,我使用了 DataTemplate 和 ContentControl :

这里没问题。

但是,我有一个 main 函数,它解析窗口中的所有内容,以保持某些视觉元素状态。当我使用 TreeHelper 来获取我的 ContentControl 的孩子时,我只得到一个视图模型 DossierViewModel。而我想要的是绑定在这个视图模型上的用户控件的视觉元素。

我怎么能跳过那个差距?

0 投票
1 回答
3611 浏览

c# - 检查指定元素是否已经是另一个元素的逻辑子元素

我是 C# 和 WPF 的初学者。我正在为一个名为 vvvv 的基于节点的软件编写插件。我已经实现了滑块、按钮和其他简单的 ui 元素。以下代码显示了滑块节点在 c# 中的外观:

现在我正在尝试实现一个 tabcontrol,我可以在其中动态创建 tabitem 并将 UIElement 输入其中。据我了解,我只能在一个 tabitem 中添加一个东西。所以我在考虑每次需要时创建一个网格,并用所有传入的 UIElement 填充它。

我进行了很多搜索,但找不到任何解决该错误的方法。显然将元素添加到网格会抛出“指定元素已经是另一个元素的逻辑子元素”;

0 投票
0 回答
113 浏览

wpf - WPF:每个视觉树也是视觉树和逻辑树的组合吗?

据我了解,逻辑树始终是 WPF 中某些元素的可视化树的子集。从技术上讲,两者之间的区别在于它们是分配给Template元素的属性(=视觉)还是分配给Content,Children或其Child属性(=逻辑)。

我想知道的是:在我分配给Template属性的可视化树中,我可以再次递归地拥有逻辑树和可视化树,因为我可以简单地再次分配可视化树TemplateContent后代。

这是真的吗?如果是这样,内部视觉/逻辑树的属性(如依赖属性继承)与最外层的有何不同?

0 投票
1 回答
490 浏览

c# - 如何获取托管在 ContentControl 中的 UserControl 的父级?

在 WPF 应用程序中,我有一个ContentControl. 在这个 ContentControl 中,我有一个View.

从一个特定的开始UserControl,我试图在它的逻辑树中向上,并在途中“激活”每个组件。例如,如果一个父母是 a Tab,我通过示例选择它。

我的问题是,当我UserControl在 aContentControl中时,当我调用时,LogicalTreeHelper.GetParent(...)我收到 null:

我的 Xaml 是这样的:

所以:知道如何ContentControl从里面的控件中获取吗?

编辑这似乎与控件位于未选择的选项卡中的事实有关(我的功能的目标是激活绑定到某物的用户控件所在的选项卡)。