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中这样做)。我会把它作为答案贴在这里(当我找到它的时候忘了它了…)你能提供一个链接到这篇文章吗?事实上,我在我知道要准确搜索什么的时候找到了多个:和