我对下面的标记有两个问题:
<Popup>
<Button x:Name="button"/>
</Popup>
VisualTreeHelper.GetParent(button)
会返回null?Popup
的父UIElement
?答案 0 :(得分:5)
您是否只是尝试了一个while循环来为.Parents提供元素,而不是通过VisualTree
?
private void TryClosePopupParent(object o)
{
while (o != null)
{
Popup p = (o as Popup);
if(p == null)
{
o = (o as FrameworkElement).Parent;
}
else
{
p.IsOpen = false;
break;
}
}
}
我还没有测试过没有有PopUp
作为父母的东西,但它对我有用。
答案 1 :(得分:3)
因为Button
仅在显示弹出窗口时添加到可视树中。
嗯...很棘手......
修改强>
以下假设你的弹出窗口是在UserControl
的XAML中定义的,所以虽然它的子节点可能不在可视化树中,但弹出原语控件是。
重新使用我之前发布的一些代码(我真的必须给我一个博客)。
public static class VisualTreeEnumeration
{
public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
{
int count = VisualTreeHelper.GetChildrenCount(root);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(root, i);
yield return child;
foreach (var descendent in Descendents(child))
yield return descendent;
}
}
}
这为DependencyObject
添加了一个扩展方法,该方法使用VisualTreeHelper
来统一搜索可视树中添加的对象。所以在后面的usercontrol代码中你可以这样做: -
var popup this.Descendents()
.OfType<Popup>()
.Where(p => p.Child == button)
.FirstOrDefault();
这将找到Popup
,它是“按钮”的父级。
答案 2 :(得分:2)
Popup
控件有时很烦人。我现在不知道为什么VisualTreeHelper.GetParent(button)
返回null。但是对于第二个this可能有帮助。
答案 3 :(得分:0)
zihotki的解决方案看起来很有前途(我还没有测试过)。
虽然VisualTreeHelper.GetParent(button)
返回null,但您可以使用button.Parent
,它应该为您提供弹出对象。
答案 4 :(得分:0)
确保PopUp
附加VisualTree
。有关详细信息,请参阅“备注”部分
http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.popup(v=vs.95).aspx