我有一个用户控件,其中我有一个偶尔会隐藏其余控件的弹出窗口。像这样:
<Grid>
<Grid Name="myGrid">
<!-- Some stuff -->
</Grid>
<Popup Width="{Binding ElementName=myGrid, Path=ActualWidth}"
PlacementTarget="{Binding ElementName=myGrid}"
Placement="Relative">
<Border Name="popupBorder">
<Grid>
<!--- Slightly different stuff --->
<Grid>
</Border>
</Popup>
</Grid>
...这很好用,当然我需要设置一个背景。我希望popup-hides-everything过渡尽可能无缝,所以如果我的弹出窗口和我的其他控件共享相同的背景,那就太好了。
当usercontrol没有明确设置背景时,我无法弄清楚如何执行此操作。
我试过这个(在XAML中):
<Border Name="popupBorder" Background="{Binding ElementName=myGrid, Path=Background}" />
我试过这个(在代码中):
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var brush = this.GetValue(UserControl.BackgroundProperty);
popupBorder.Background = (Brush)brush;
}
在所有情况下,边框的背景为“null”,弹出窗口只是一个大黑块。有没有办法做到这一点?
(如果你想告诉我有一个更好的方法来做我想做的事情......我有一个很长的清单;我想用“看到更多”按钮显示前几个项目;整个混乱是在ItemsControl中,我不希望“查看更多”按钮来调整项目的大小 - 因此,在弹出窗口中显示长列表。)
答案 0 :(得分:0)
从dkozl获得一些建议后,我能够实施以下解决方案:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
puBorder.Background = findBackground(this) ?? SystemColors.ControlBrush;
}
private Brush findBackground(DependencyObject element)
{
var parent = element;
while (parent != null)
{
var p = parent as Control;
if (p != null && p.Background != null)
return p.Background;
parent = VisualTreeHelper.GetParent(parent);
}
return null;
}
我尝试在转换器中执行相同的操作,但转换器在将控件添加到可视化树之前执行(我假设,它还没有视觉父级),所以它不是&#39;有用。