Когда вы вызываете Arrange для объекта, он перерисовывается в указанном вами месте относительно его родителя.Поскольку его родителем является сетка, (0,0, size.Width, size.Height) поместит его в верхний левый угол.
Чтобы решить вашу непосредственную проблему, вместо измерения и упорядочения,Вы должны просто позвонить InvalidateMeasure
:
strange.Visual = strange.CreateDrawingVisualRectangle();
strange.InvalidateMeasure();
Однако я думаю, что вы подходите к этой проблеме немного неправильно.Я думаю, что вы хотите сделать, это переопределить OnRender
, чтобы получить контроль.Это очень похоже на то, что вы делаете с DrawingVisual
, за исключением того, что ваш FrameworkElement
- это то, что рисуется:
protected override void OnRender(DrawingContext dc)
{
var rect = new Rect(new Point(0, 0), new Size(100, 100));
dc.DrawRectangle(Brushes.Red, null, rect);
}
Я предполагаю, что у вас есть некоторые DependencyProperty, которые вы используете для управлениякак нарисован ваш Strange
класс.Если вы зарегистрируете их с помощью свойства FrameworkPropertyMetadata.AffectsRender
, это автоматически приведет к перерисовке класса.Например, это позволит вам установить Color
для объекта Strange
, и он будет автоматически перерисован при установке свойства:
public class Strange : FrameworkElement
{
#region Color Dependency Property
public static readonly DependencyProperty ColorProperty =
DependencyProperty.Register(
"Color",
typeof(Color),
typeof(Strange),
new FrameworkPropertyMetadata(Colors.Red,
FrameworkPropertyMetadataOptions.AffectsRender));
public Color Color
{
get { return (Color)GetValue(ColorProperty); }
set { SetValue(ColorProperty, value); }
}
#endregion
protected override void OnRender(DrawingContext dc)
{
var rect = new Rect(new Point(0, 0), new Size(100, 100));
dc.DrawRectangle(new SolidColorBrush(Color), null, rect);
}
}