我想创建一个易于使用的加载叠加层。为此,我想使用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。
谢谢:)
答案 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;
}