获得继承背景的价值

时间:2014-05-02 21:14:14

标签: wpf popup

我有一个用户控件,其中我有一个偶尔会隐藏其余控件的弹出窗口。像这样:

<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中,我不希望“查看更多”按钮来调整项目的大小 - 因此,在弹出窗口中显示长列表。)

1 个答案:

答案 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;有用。