DrawGeometry() в методе OnRender()

У меня есть UserControl, который переопределяет метод OnRender следующим образом:

MyUsercontrol.cs:

MyUserControl: UserControl
{
    protected override void OnRender(DrawingContext dc)
    {
       dc.DrawRectangle(Brushes.White, new Pen(Brushes.Black,1), new Rect(0,10,50,30));

       var visualBrush = new VisualBrush(new UserControl1{Height=30, Width=50});           
       dc.DrawGeometry(visualBrush, null, new RectangleGeometry(new Rect(50,10,50,30)));           
    }
}

Используемый выше UserControl выглядит следующим образом (определено в xaml, без дополнительного кода программной части):

<UserControl x:Class="VisualBrushExample.UserControl1" ...>
<Grid>
   <Border BorderThickness="1" BorderBrush="Black" Background="White" CornerRadius=8,0,0,8"/>
</Grid>
</UserControl>

Теперь, если я использую MyUserControl, я получаю следующий вывод:

пример созданного вывода с помощью MyUserControl

Теперь мой вопрос: существует ли способ, как я могу использовать UserControl1 в методе OnRender() без получения этой прозрачной границы вокруг UserControl1-Rectangle.

Заранее спасибо, rhe1980


person rhe1980    schedule 04.07.2012    source источник
comment
Какую прозрачную границу вы имеете в виду? И если речь действительно идет о рисовании двух прямоугольников друг над другом, то это самый сложный и запутанный способ.   -  person Clemens    schedule 04.07.2012
comment
левый пользовательский элемент управления (с закругленными углами) меньше правого. Мне кажется, что dc.DrawGeometry() использует Pen, даже если передается «null».   -  person rhe1980    schedule 04.07.2012
comment
возможно, это выглядит сложно. на самом деле я хочу только поместить UserControl в другой во время метода OnRender(). И да, есть другие (лучшие) способы использования UserControl (например, в xaml и т. д.). Но я только изменяю существующий UserControl, который использует этот механизм.   -  person rhe1980    schedule 04.07.2012


Ответы (1)


Причина, по которой вы видите прямоугольник разного размера, проста. Когда вы рисуете прямоугольник с помощью пера, линия пера центрируется на краях прямоугольника, или, другими словами, край лежит в середине линии. Следовательно, половина ширины пера лежит за пределами прямоугольника в каждом направлении. Следовательно, вам нужно добавить одну ширину пера к ширине и высоте прямоугольника, чтобы получить общий размер вывода рисунка, 51 x 31 в вашем примере.

Возможно, вы можете проверить это с помощью метода Geometry.GetRenderBounds.

person Clemens    schedule 04.07.2012