Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用装饰器加载WPF覆盖_C#_Wpf_Overlay_Loading_Adorner - Fatal编程技术网

C# 使用装饰器加载WPF覆盖

C# 使用装饰器加载WPF覆盖,c#,wpf,overlay,loading,adorner,C#,Wpf,Overlay,Loading,Adorner,我想创建一个易于使用的加载覆盖。为此,我想使用装饰器。问题是:我想展示一个进度循环。为此,我需要一个控制 我试图渲染控件,但看不到任何内容: protected override void OnRender(DrawingContext drawingContext) { Size parentSize = this.AdornedElement.DesiredSize; drawingContext.DrawRectangle(new

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

我试图渲染控件,但看不到任何内容:

        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


谢谢:)

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

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


我最近发现了一篇几乎无法通过谷歌找到的文章。它展示了如何解决这个问题(非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;
    }

我必须补充一点,这使我们能够完全使用XAML,而不需要代码。如果你只想写代码,你应该遵循你的方法。谢谢,我已经找到了这个。我做了更多的研究,终于找到了一篇文章,展示了如何解决这个问题(我不想在XAML中这样做)。我会把它作为答案贴在这里(当我找到它的时候忘了它了…)你能提供一个链接到这篇文章吗?事实上,我在我知道要准确搜索什么的时候找到了多个:和