问题标签 [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.
c# - 视觉和逻辑树遍历不检索几个级别
我正在从同一个应用程序中探索逻辑树和可视树,但没有成功深入各个级别。
我的代码使用通用资源管理器:
ProcessLogicalTree
并简单地迭代(在重新调用ProcessVisualTree
之前做一些事情)。ProcessGenericTree
结果看起来很完整,但是当我尝试将 a 检索TextBlock
到GridViewColumn
Header 中时,看起来该项目既不存在于 Logical 中,也不存在于 Visual 的叶子列表中FrameworkElement
。
它似乎是一个视觉元素变成一个逻辑元素。事实上,添加一个手表,这TextBlock
出现在我的Visual Children中GridView
(检索为合乎逻辑,它处于Tab Item
未选中状态),但我的代码并非无法获取它。
我的电话很简单:
其中 root 是主窗口。
那么,我怎样才能在最深层次上探索我的树呢?也许重新遍历检索到的FrameworkElement
列表?我认为我的 ProcessGeneric 代码已经做到了。
更新:WPF Visualizer 显示了这种结构:
该GridViewColumnHeader
级别包含我TextBlock
的,但视觉树不包含。
更新2:使用从主窗口开始的递归,我的元素可见我无法使用以下代码查找具有指定名称的对象:
我很确定VisualTreeHelper
无法检索 Header 属性中的元素,但WPF Inspector工作正常。
我想知道它是否使用不同的方法来遍历树(也许也检查Properties
类似的方法Header
)。建议?
wpf - 将逻辑树外部的 DependencyObject 绑定到逻辑树中的元素的属性
已编辑
问题总结:
我有一个自定义控件,它有一个ObservableCollection
of DependencyObject
s。因为DependencyObject
s 不是控件的子控件,所以它们不在逻辑树中。但是,我需要它们使用 XAML 绑定到逻辑树中元素的属性。(我不能使用代码隐藏。)我尝试使用Source={x:Reference blah},但由于周期性依赖限制,我无法使用它。
有谁知道我如何将DependencyObject
s 添加到逻辑树?或者有没有人有任何其他想法如何解决这个问题?
细节:
我正在开发一个自定义ComboBox
. 我希望我的一个es根据同一窗口上ComboBox
其他es中选择的值过滤可见的项目。ComboBox
例子:
一个ComboBox
显示存储在我的数据库中的产品列表,另一个显示产品类型。我希望第二个ComboBox
在选择项目时过滤第一个的可见项目,我希望第一个ComboBox
过滤可见项目并设置第二个的值。
由于我设置“ProductTypes”表的方式,“typeName”字段不是唯一的,所以如果我希望我ComboBox
只显示产品类型的唯一名称,那么我必须使用dataTable.DefaultView.ToTable(unique: true, column: "typeName").DefaultView
.
代码:
customComboBox
有一个ObservableCollection
ofFilterBinding
对象,它绑定到其他ComboBox
es 的选定值。这是FilterBinding
课程:
这是我的自定义代码ComboBox
。它实际上继承自 Telerik 的RadComboBox
,但它的行为非常像普通的ComboBox
。
这是 XAML:
但是,它不会绑定 FilterBindings,因为 ElementName 仅适用于逻辑树中的元素。
我不使用 MVVM。相反,我得到了一个DataTable
通过 SQL。最终我将使用 EntityFramework,但它不会改变ItemsSource
将分配给DataView
从 LINQ 派生的事实。我需要使用的原因DataView
是因为有时DisplayMemberPath
会引用具有非唯一条目的列,这些条目需要在ComboBox
.
wpf - 如何在发布中调试“指定元素已经是另一个元素的逻辑子元素”
我知道我应该用代码示例发布一个非常具体的问题,但我不知道从哪里开始:
在 Visual Studio 中运行我的应用程序时,在调试和发布模式下都可以。但是,当我创建 InstallShield 安装程序时,在其他计算机上出现异常:
System.Windows.Threading.Dispatcher WPF 指定元素已经是另一个元素的逻辑子元素。先断网
我在 StackOverflow 和其他网站上看到了大量关于这个问题的帖子,但没有任何参考资料表明这只发生在已安装的包中。
我的问题是双重的(也很抱歉):
- 我怎么可能调试这样的问题?我的意思是,特别是如果可能的话(不是通用的运行时调试)
- 我可以捕获什么样的异常来提供有关错误的更多信息?我正在显示一个显示 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;这是确保的唯一方法。
c# - 从 WPF 中的任何/未指定的父容器断开元素
我有一个控件是另一个控件的子控件(因为所有非根控件/元素都在 WPF 中)。如果我想将控件移动到另一个容器,我必须先将它与当前容器断开连接(否则会引发异常)。
如果我知道父母是什么,那么我可以将其从其 Children 集合或 Content 或其他内容中删除。但是如果我不知道父容器的类型是什么——那我该如何移除子控件呢?
在下面的代码示例中:如何在不知道父级(面板、组框...)的类型的情况下将“sp1”移动到另一个容器?
理想情况下,我只想写一些类似的东西:
但我还没有找到类似的东西。
c# - 为自定义控件构建逻辑树
我正在开发一个控件,ObservableCollection
它的DependencyProperties
. 此属性设置DefaultProperty
为我的控件,因此我可以通过构造类似于以下内容的行将项目隐式添加到 XAML 中的集合中:
据我了解,WPF 引擎在解析 XAML 时会构建逻辑树。因此,每个都MyItem
应该是MyControl
. 相反,MyControl
应该是每个 的逻辑父级MyItem
。
好吧,显然还有更多。下面是我用来定义上述关系的代码。自定义控件包含一个DependencyProperty
forObservableCollection
并且它由一个 CLR 属性支持。
从MyItem
(继承FrameworkContentElement
)开始,我尝试像这样访问它的逻辑父级:
令我惊讶的是,父控件永远不会重新呈现。这是因为该MyItem.Parent
属性为空。为什么是这样?
我如何指示 WPF 引擎知道它MyControl
应该是逻辑父级MyItem
?
c# - 使用逻辑父函数
也许我的问题完全是愚蠢的,但我正在努力做到最好。
我想做的就是使用父元素的函数/属性。
我准备了一个没有意义的简单示例:
谢谢!
编辑:我想我必须为您提供更多信息。
我的用户能够将值拖到画布上。我的画布在父类的列表中。现在我的画布想知道列表中的任何其他画布是否已经具有相同的值。
我的实现想法:
用户进行拖动 --> Canvas 得到一个事件 --> Canvas 询问父类是否有任何其他 Canvas 已经具有相同的值 --> 决定做什么。
明天我会发布一个更详细的例子!
c# - 解析内容控制中的视觉元素:查看模型问题
我想要一个干净的解决方案来解决我遇到的一个小问题:我有一个标准的主页视图及其视图模型,在视图内我显示一个用户控件(Dossier)及其视图模型(DossierViewModel)。
为了从主视图模型动态实例化我的视图,我使用了 DataTemplate 和 ContentControl :
这里没问题。
但是,我有一个 main 函数,它解析窗口中的所有内容,以保持某些视觉元素状态。当我使用 TreeHelper 来获取我的 ContentControl 的孩子时,我只得到一个视图模型 DossierViewModel。而我想要的是绑定在这个视图模型上的用户控件的视觉元素。
我怎么能跳过那个差距?
c# - 检查指定元素是否已经是另一个元素的逻辑子元素
我是 C# 和 WPF 的初学者。我正在为一个名为 vvvv 的基于节点的软件编写插件。我已经实现了滑块、按钮和其他简单的 ui 元素。以下代码显示了滑块节点在 c# 中的外观:
现在我正在尝试实现一个 tabcontrol,我可以在其中动态创建 tabitem 并将 UIElement 输入其中。据我了解,我只能在一个 tabitem 中添加一个东西。所以我在考虑每次需要时创建一个网格,并用所有传入的 UIElement 填充它。
我进行了很多搜索,但找不到任何解决该错误的方法。显然将元素添加到网格会抛出“指定元素已经是另一个元素的逻辑子元素”;
wpf - WPF:每个视觉树也是视觉树和逻辑树的组合吗?
据我了解,逻辑树始终是 WPF 中某些元素的可视化树的子集。从技术上讲,两者之间的区别在于它们是分配给Template
元素的属性(=视觉)还是分配给Content
,Children
或其Child
属性(=逻辑)。
我想知道的是:在我分配给Template
属性的可视化树中,我可以再次递归地拥有逻辑树和可视化树,因为我可以简单地再次分配可视化树Template
的Content
后代。
这是真的吗?如果是这样,内部视觉/逻辑树的属性(如依赖属性继承)与最外层的有何不同?
c# - 如何获取托管在 ContentControl 中的 UserControl 的父级?
在 WPF 应用程序中,我有一个ContentControl
. 在这个 ContentControl 中,我有一个View
.
从一个特定的开始UserControl
,我试图在它的逻辑树中向上,并在途中“激活”每个组件。例如,如果一个父母是 a Tab
,我通过示例选择它。
我的问题是,当我UserControl
在 aContentControl
中时,当我调用时,LogicalTreeHelper.GetParent(...)
我收到 null:
我的 Xaml 是这样的:
所以:知道如何ContentControl
从里面的控件中获取吗?
编辑这似乎与控件位于未选择的选项卡中的事实有关(我的功能的目标是激活绑定到某物的用户控件所在的选项卡)。