, InvalidateVisual, InvalidateArrange . OnRender , WPF ( InvalidateArrange) ( InvalidateVisual).
FrameworkPropertyMetadata.AffectsRende r WPF InvalidateVisual .
( MainControl), OnRender , InvalidateVisual , . , WPF , , .
, (, NestedControl), MainControl. MainControl ControlTemplate, z-. InvalidateNestedControl MainControl, InvalidateVisual NestedControl.
. , ...
public class TestPanel : DockPanel
{
protected override Size MeasureOverride(Size constraint)
{
System.Console.WriteLine("MeasureOverride called for " + this.Name + ".");
return base.MeasureOverride(constraint);
}
protected override System.Windows.Size ArrangeOverride(System.Windows.Size arrangeSize)
{
System.Console.WriteLine("ArrangeOverride called for " + this.Name + ".");
return base.ArrangeOverride(arrangeSize);
}
protected override void OnRender(System.Windows.Media.DrawingContext dc)
{
System.Console.WriteLine("OnRender called for " + this.Name + ".");
base.OnRender(dc);
}
}
... ( , ):
<Button Content="Test" Click="Button_Click" DockPanel.Dock="Top" HorizontalAlignment="Left" />
<l:TestPanel x:Name="InnerPanel" Background="Red" Margin="16" />
, ...
MeasureOverride MainTestPanel.
MeasureOverride InnerPanel.
ArrangeOverride MainTestPanel.
ArrangeOverride InnerPanel.
OnRender InnerPanel.
OnRender MainTestPanel.
InvalidateVisual "MainTestPanel" ( 'Click'), ...
ArrangeOverride MainTestPanel.
OnRender MainTestPanel.
, , ArrangeOverride .
, ArrangeOverride (, , ), (), , , .
, , AffectsParentArrange ( , ), Nullable Size ArrangeOverride, , , ...
public class TestPanel : DockPanel
{
Size? arrangeResult;
protected override Size MeasureOverride(Size constraint)
{
arrangeResult = null;
System.Console.WriteLine("MeasureOverride called for " + this.Name + ".");
return base.MeasureOverride(constraint);
}
protected override System.Windows.Size ArrangeOverride(System.Windows.Size arrangeSize)
{
if(!arrangeResult.HasValue)
{
System.Console.WriteLine("ArrangeOverride called for " + this.Name + ".");
arrangeResult = base.ArrangeOverride(arrangeSize);
}
return arrangeResult.Value;
}
protected override void OnRender(System.Windows.Media.DrawingContext dc)
{
System.Console.WriteLine("OnRender called for " + this.Name + ".");
base.OnRender(dc);
}
}
, - ( MeasureOverride), OnRender, Arrange, , InvalidateVisual.