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();。首先放在容器上。
这也可以解释为什么有时返回某些内容。