使用Adorners的WPF加载叠加层

时间:2013-12-26 19:51:35

标签: c# wpf overlay loading adorner

我想创建一个易于使用的加载叠加层。为此,我想使用Adorners。问题是:我想展示一个进步圈。为此我需要一个控件。

我试图渲染控件,但我看不到任何东西:

        protected override void OnRender(DrawingContext drawingContext)
    {
        Size parentSize = this.AdornedElement.DesiredSize;

        drawingContext.DrawRectangle(new SolidColorBrush(Color.FromArgb((byte)(255 * 0.30), 0, 0, 0)), null,
            new Rect(0, 0, parentSize.Width, parentSize.Height));

        RenderTargetBitmap target = new RenderTargetBitmap(50, 50, 96, 96,
            PixelFormats.Pbgra32);
        target.Render(_ring);
        drawingContext.DrawImage(target,
            new Rect(parentSize.Width / 2 - target.Width / 2, parentSize.Height / 2 - target.Height / 2, target.Width, target.Height));

        double textUpperPos = parentSize.Height / 2 + target.Height / 2 + 10;
        target = new RenderTargetBitmap((int)parentSize.Width - 30, (int)parentSize.Height - (int)textUpperPos - 10, 96, 96,
            PixelFormats.Pbgra32);
        drawingContext.DrawImage(target,
            new Rect(parentSize.Width / 2 - target.Width / 2, textUpperPos, target.Width, target.Height));
    }

灰色背景可见,但没有控件(TextBlock& ProgressCircle)。这种方法甚至可以实现吗?还有更好的方法吗?

我想要一个可以应用最大值的叠加层。 1-3行代码。非XAML。

谢谢:)

2 个答案:

答案 0 :(得分:1)

我已经为类似的解决方案做了一些研究。

您可能会发现这篇文章很有趣:

http://www.codeproject.com/Articles/57984/WPF-Loading-Wait-Adorner

答案 1 :(得分:1)

我最近发现了一篇几乎无法通过Google找到的文章。它展示了如何解决这个问题(非XAML方式):

您必须使用VisualCollection和ContentPresenter。一些小的补充,它的工作是完美的。

        public LoadingAdorner(UIElement adornedElement)
        : base(adornedElement)
    {
        if (DesignerProperties.GetIsInDesignMode(this)) return;

        _visuals = new VisualCollection(this);
        _contentPresenter = new ContentPresenter();
        _visuals.Add(_contentPresenter);

        _grid = new Grid
        {
            HorizontalAlignment = HorizontalAlignment.Stretch,
            VerticalAlignment = VerticalAlignment.Stretch
        };
        _contentPresenter.Content = _grid; // Or the single control you want to display

        // Add your controls here to grid
    }

    protected override int VisualChildrenCount
    {
        get { return _visuals.Count; }
    }

    protected override Visual GetVisualChild(int index)
    {
        return _visuals[index];
    }

    protected override Size MeasureOverride(Size constraint)
    {
        _contentPresenter.Measure(constraint);
        return _contentPresenter.DesiredSize;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        _contentPresenter.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
        return _contentPresenter.RenderSize;
    }