我想要创建一个易于使用的加载覆盖层。为此,我想使用Adorner。问题是:我想展示一个进步的循环。为此我需要一个控制。
我试着渲染控件,但我什么也看不见:
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。
谢谢:)
发布于 2014-01-27 14:21:38
我最近发现了一篇文章,这篇文章几乎无法通过谷歌找到。它展示了如何解决这个问题(非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;
}发布于 2014-01-17 14:05:22
我已经为类似的解决方案做了一些研究。
您可能会发现这篇文章很有趣:
http://www.codeproject.com/Articles/57984/WPF-Loading-Wait-Adorner
https://stackoverflow.com/questions/20790461
复制相似问题