首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF使用Adorner加载覆盖

WPF使用Adorner加载覆盖
EN

Stack Overflow用户
提问于 2013-12-26 19:51:35
回答 2查看 3.9K关注 0票数 0

我想要创建一个易于使用的加载覆盖层。为此,我想使用Adorner。问题是:我想展示一个进步的循环。为此我需要一个控制。

我试着渲染控件,但我什么也看不见:

代码语言:javascript
复制
        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。

谢谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-27 14:21:38

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

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

代码语言:javascript
复制
        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;
    }
票数 1
EN

Stack Overflow用户

发布于 2014-01-17 14:05:22

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20790461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档