问题标签 [visualtreehelper]

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 投票
1 回答
3611 浏览

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

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

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

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

0 投票
0 回答
33 浏览

c# - 列表在视觉上刷新,但 VisualTreeHelper 列表不正确

在按钮上单击 GalaSoft.MvvmLight.Messaging 消息会在所有注册了消息接收器的视图模型中触发。异步获取新的数据列表并用于更新 UI。UI 更新,但是当我调用以下命令时

var contentControls = VisualTreeQueryHelper.FindChildrenOfType(this).ToList();

即使屏幕上的视觉列表是正确的,它仍然反映旧列表的内容计数和索引。这打破了我使用索引和列表大小来设置焦点的焦点逻辑。

如果我离开视图并返回,则更正 contentControls 列表。


0 投票
0 回答
37 浏览

wpf - 图表系列未保存在图像中

在我的 WPF 项目中,我使用Control.Datavisualization.Charting.Chart控件来绘制一些线条系列。

我还想将其存储Chart到图像中,因此我执行以下操作(在创建系列之后):

其中saveChartToPng()如下:

saveChartToPng()图表保存到图像后,但图像中不存在系列。系列在窗口内的图表中可见。

在打电话之前我错过了saveChartToPng()什么?

0 投票
2 回答
4320 浏览

c# - 为什么单击树会引发“System.Windows.Documents.Run”不是 Visual 或 Visual3D”InvalidOperationException?

有时右键单击 treeviewitem 会导致未处理的 InvalidOperationException。在后面的代码中,我选择了右键单击的行:

根据上面的stacktrace是问题的根源。

xml:

堆栈跟踪:

我只能有时重现这个。我的同事说左键单击项目 1 和右键单击项目 2 每次都会在某些树中产生这个。

0 投票
1 回答
1828 浏览

c# - 如何使用 WPF 循环通过 TabControl 中的复选框?

我正在尝试遍历选项卡控件的子元素,以了解哪些复选框设置为选中或未选中。我在 SO 上找到了各种答案,但我似乎无法获得代码来做我需要的事情。到目前为止,这是我所拥有的:

很可能,我错误地思考了 VisualTreeHelper 类的工作原理。我想我可以通过 XAML 代码继续工作以继续进入选项卡控件的越来越深的子项?目前,我在 WPF 的 xaml 上的代码如下所示:

所以,我的理解是我必须从一个孩子到另一个孩子,意思是,使用 VisualTreeHelper 获取 Tab Control 的 Children(选择 Tab Item),然后获取 TabItem 的孩子(选择网格),然后获取Grid 的子项,然后我终于可以遍历子项(复选框)来获取我想要的信息。如果我弄错了,有人可以解释我哪里出错了吗?

编辑:将 Checkbox XAML 更改为正确的代码

0 投票
2 回答
530 浏览

c# - VisualTreeHelper.FindElementsInHostCoordinates 不返回 IsHitTestVisible 设置为 false 的控件

我正在做一些实验,我正在尝试收集放置在鼠标指针下的所有元素。

XAML 测试代码

要获取鼠标指针的坐标,我使用PointerMoved

这种方法有效,但是,当控件的属性IsHitTestVisible设置为 时,即使我将此方法的第三个参数设置为false,也不考虑它。FindElementsInHostCoordinatesincludeAllElementstrue

根据文档,如果我将参数设置includeAllElementstrue,它应该会找到所有元素,包括那些IsHitTestVisible设置为的控件false

includeAllElements [System.Boolean]

true 包括所有相交的元素,包括那些被认为对命中测试不可见的元素。false 仅查找可见的、可命中测试的元素。默认值为假。

我是否理解错误的工作方式FindElementsInHostCoordinates?如果是这样,是否有任何其他方法可以检索特定坐标处的所有控件,即使它们已IsHitTestVisible设置为false

0 投票
1 回答
477 浏览

c# - WPF | 折叠的父级上的 VisualTreeHelper.GetChildrenCount(this)

我有一个“巨大的” Control,其中约 50% 是collapsed. 您可以通过属性切换以隐藏该visible部分并显示该部分collapsed

现在,当Control加载 s 时,我尝试在控件的and部分中找到所有FooControls 。问题是,只有零件的s被发现。如果我编写代码,我可以在折叠部分的父控件中看到s。visiblecollapsedFooControlvisibledebugFooControl

你能给我一个提示如何解决这个问题吗?

我需要在加载后Property更改一个。FooControl我还需要动态,因为它带有一个behavior.

0 投票
2 回答
735 浏览

wpf - VisualTreeHelper.GetDescendantBounds 返回“空”(无穷大)

在我的 WPF 应用程序中,我在运行时从 XML 动态加载 XAML 绘图。此图是一系列复杂的嵌套画布和几何“路径”(例如):

外部画布的高度/宽度设置不正确,因为许多路径表达式超出了这些尺寸。我对此源 XML 没有任何控制权,因此我需要在加载图形后在运行时对其进行修复。要加载绘图,我使用类似于以下的代码:

然后,我尝试使用以下代码重置画布大小:

除了,在我创建画布元素的地方,边界是空的。但是,如果我只是连接一个简单的按钮并在同一个画布上交互调用 GetDescendantBounds(),那么我会收到预期的高度/宽度。

我的收获是 GetDescendantBounds() 除非具有新控件的布局已完成,否则它不起作用。所以我的问题是:

  1. 有没有办法在运行 GetDescendantBounds() 之前强制进行布局计算?或者……</li>
  2. 在将视觉树添加到其父级之前,是否有另一种方法可以获取视觉树的边界/范围?

谢谢

-约翰

0 投票
1 回答
848 浏览

c# - 如何将 DependencyObject 转换为 AutomationElement?

我正在使用返回DependencyObjects的VisualTreeHelper通过其 VisualTree 遍历 WPF 应用程序。

但是,一旦我找到我正在寻找的对象(在这种情况下它是一个按钮),我需要“按下”/调用它。我已经在AutomationElement上使用InvokePattern成功调用了一个按钮。

所以问题是:如何将 DependencyObjects 转换为 AutomationElement?
或者:我如何调用 DependancyObject?
或者:我如何创建一个指向与给定 DependencyObjects 剂量相同的 WPF 元素的 AutomationElement?

Edit1:
我发现我可以将 DependancyObject 转换为控件。

但是问题是:我如何调用控件?
或者:如何将控件转换为 AutomationElement?

0 投票
2 回答
514 浏览

c# - VisualTreeHelper 在 DataGridTemplateColumn.CellTemplate 中找不到控件

我使用此方法列出用户控件的所有按钮:

除了DataGridTemplateColumn.CellTemplate中的按钮外,它运行良好

VisualTreeHelper.GetChild ”似乎无法在数据网格项中找到控件。