替代Silverlight 4中的FindAncestor RelativeSource以绑定到页面的属性

时间:2010-05-06 09:36:26

标签: silverlight data-binding xaml popup

FindAncestor RelativeSource仅支持'Self'和'TemplatedParent', 但我必须将弹出窗口的宽度绑定到页面的宽度。

为页面命名会导致问题,因为有时会出现问题 抛出异常,说可视树中已存在具有该名称的控件。

<Popup IsOpen="True"
       Width="{Binding ElementName=BordPage, Path=Width}"
       Height="{Binding ElementName=BordPage, Path=Height}">

背景资料:

我在这里使用基于SL4导航的应用程序。 BordPage是一个导航页面, 我在应用程序中多次使用它。所以在页面中给它起一个名字并不是一个好主意, 但我不知道我怎么能绑定到页面的宽度和高度。

我要做的是在整个屏幕上覆盖黑色边框(不透明度为0.8), (包括MainPage的控件)。然后,我想显示一些其他控件。

由于应用程序是触控式的,因此为用户提供一个ComboBox来选择一个值并不能真正起作用。相反,我希望显示这个黑色覆盖窗口,其中列表框占据了大部分屏幕,因此用户只需单击即可轻松触摸他想要的值。

更新:我刚刚意识到我可以使用ChildWindow类来执行此操作。 但我原来的问题仍然存在。

2 个答案:

答案 0 :(得分:1)

我对此问题的一般解决方案是编写自定义行为。它不是纯粹的XAML解决方案,但它为您提供了更大的灵活性。

创建一个行为,搜索VisualTree以找到正确的项目,然后让它正确设置Popup的宽度。

它可能比直接绑定更复杂,但它避免了所有命名问题。

答案 1 :(得分:1)

将以下内容放在控件的构造函数中,这样就可以避免命名它:

DataContext = this;