FindName为我坏了:(

我要寻找的对象在那里。我有证据

这是场景:

ToggleButton button = (ToggleButton)sender;
Popup popup = (Popup)button.FindName("popSelectIteration");
popup为null,但并非总是如此。偶尔而已。但是即使将其设置为null,我正在寻找的 child 也在那里。

我在它为null时设置了一个断点,并抓取了这两个屏幕截图。

FindName返回“popSelectIteration”的null的位置。

但是,如果您深入观察 watch ,就会发现 child 在那里。

那我想念什么呢?为什么找不到FindName?从屏幕快照中可以看到,这不是时间问题(FindName watch 为空,但直接路径很好)。

有没有更好的方法来找到控件?

旁注:如果您对相关的切换按钮感兴趣,可以在以下问题中找到它:WPF - FrameworkElement - Enumerate all decendents?

更新:我进行了一些挖掘工作,以了解为什么此方法有时会失败,有时又会失败。我有一个动画,调用NameScope.SetNameScope((DependencyObject)form, new NameScope());(完整方法代码here)。在此之后,FindName开始失败。

我不太明白那个电话。我想我复制并粘贴了代码。无论如何,我将其注释掉。但是我很想知道这为什么会失败。

最佳答案

我想这与视觉树和逻辑树之间的差异有关。该控件在逻辑树中,但也许尚未应用该控件的模板,因此FindName将不会返回任何有用的信息。

您可以尝试调用ApplyTemplate();。首先放在容器上。

这也可以解释为什么有时返回某些内容。

08-27 17:34