在我的自定义控件中,我有一个ContainerVisual对象和一个DrawingVisual。
我重写ArrangeOverride并根据给定的大小和控件的填充计算我想要绘制的矩形。
之后我将ContainerVisual对象的变换设置为矩形的左上角,以便渲染绘图的方法不必考虑矩形并假设绘图原点位于点0,0。 / p>
这不起作用,图纸被取代了。如果相反我设置了它的工作方式的DrawingVisual对象的变换,并且矩形以它应该的方式显示。
我认为如果我在容器上设置转换,它将自动应用于其下的视觉效果。是这样吗?
感谢您的帮助
编辑:更新了源代码以显示完整代码。
class MyControl : Control
{
private readonly ContainerVisual container = new ContainerVisual();
private readonly DrawingVisual drawing = new DrawingVisual();
private Rect rect;
private void RenderDrawing()
{
using (var c = drawing.RenderOpen())
{
var p = new Pen(new SolidColorBrush(Colors.Black), 1);
c.DrawRectangle(null, p, new Rect(0, 0, rect.Width, rect.Height));
}
}
protected override Size ArrangeOverride(Size s)
{
var h = Math.Max(0, s.Height - Padding.Top - Padding.Bottom);
var w = Math.Max(0, s.Width - Padding.Left - Padding.Right);
var r = new Rect(Padding.Left, Padding.Top, w, h);
if (rect != r)
{
rect = r;
container.Clip = new RectangleGeometry(rect);
container.Transform = new TranslateTransform(rect.Left, rect.Top);
// replace the line above with the following line to make it work
// drawing.Transform = new TranslateTransform(rect.Left, rect.Top);
RenderDrawing();
}
return s;
}
protected override Visual GetVisualChild(int index)
{
return container;
}
protected override Size MeasureOverride(Size s)
{
return new Size();
}
protected override int VisualChildrenCount
{
get { return 1; }
}
public MyControl()
{
container.Children.Add(drawing);
AddVisualChild(container);
}
}
<Window x:Class="MyApp.MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:c="clr-namespace:MyApp"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<c:MyControl Padding="20" />
</Grid>
</Window>
答案 0 :(得分:3)
答案 1 :(得分:0)
问题在于container.Clip。它应该是
container.Clip = new RectangleGeometry(new Rect(0, 0, w, h));