ContainerVisual.Transform的问题

时间:2010-11-09 17:51:20

标签: wpf wpf-controls

在我的自定义控件中,我有一个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>

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

问题在于container.Clip。它应该是


container.Clip = new RectangleGeometry(new Rect(0, 0, w, h));