本文整理汇总了C#中Control.Arrange方法的典型用法代码示例。如果您正苦于以下问题:C# Control.Arrange方法的具体用法?C# Control.Arrange怎么用?C# Control.Arrange使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Control
的用法示例。
在下文中一共展示了Control.Arrange方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: updateLayout
private void updateLayout(Control control, List<Control> revalidatedControls)
{
LayoutInfo lastLayoutInfo = control.lastLayoutInfo;
// работаем с родительским элементом управления
if (control.Parent != null) {
bool needUpdateParentLayout = true;
// если размер текущего контрола не изменился, то состояние ревалидации не распространяется
// вверх по дереву элементов, и мы переходим к работе с дочерними элементами
// в противном случае мы добавляем родительский элемент в конец очереди ревалидации, и
// возвращаем управление
if (lastLayoutInfo.validity != LayoutValidity.Nothing) {
control.Measure(lastLayoutInfo.measureArgument);
// if (lastLayoutInfo.unclippedDesiredSize == control.layoutInfo.unclippedDesiredSize) {
if (checkDesiredSizeNotChangedRecursively(control)) {
needUpdateParentLayout = false;
}
}
if (needUpdateParentLayout) {
// mark the parent control for invalidation too and enqueue them
control.Parent.Invalidate();
// мы можем закончить с этим элементом, поскольку мы уже добавили
// в конец очереди его родителя, и мы все равно вернемся к нему в след. раз
return;
}
}
// работаем с дочерними элементами управления
// вызываем для текущего контрола Measure&Arrange с последними значениями аргументов
if (lastLayoutInfo.validity == LayoutValidity.Nothing && control.Parent != null) {
throw new InvalidOperationException("Assertion failed.");
}
// rootElement - особый случай
if (control.Parent == null) {
if (control != RootElement) {
throw new InvalidOperationException("Control has no parent but is not known rootElement.");
}
control.Measure(RootElementRect.Size);
control.Arrange(RootElementRect);
} else {
control.Measure(lastLayoutInfo.measureArgument);
control.Arrange(lastLayoutInfo.renderSlotRect);
}
// update render buffers of current control and its children
RenderingBuffer buffer = getOrCreateBufferForControl(control);
RenderingBuffer fullBuffer = getOrCreateFullBufferForControl(control);
// replace buffers if control has grown
LayoutInfo layoutInfo = control.layoutInfo;
if (layoutInfo.renderSize.width > buffer.Width || layoutInfo.renderSize.height > buffer.Height) {
buffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height);
fullBuffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height);
buffers[control] = buffer;
fullBuffers[control] = fullBuffer;
}
buffer.Clear();
if (control.RenderSize.Width != 0 && control.RenderSize.Height != 0)
control.Render(buffer);
// проверяем дочерние контролы - если их layoutInfo не изменился по сравнению с последним,
// то мы можем взять их последний renderBuffer без обновления и применить к текущему контролу
fullBuffer.CopyFrom(buffer);
IList<Control> children = control.Children;
foreach (Control child in children) {
if (child.Visibility == Visibility.Visible) {
RenderingBuffer fullChildBuffer = processControl(child, revalidatedControls);
fullBuffer.ApplyChild(fullChildBuffer, child.ActualOffset,
child.RenderSize,
child.RenderSlotRect, child.LayoutClip);
} else {
// чтобы следующий Invalidate перезаписал lastLayoutInfo
if (child.SetValidityToRender()) {
revalidatedControls.Add(child);
}
}
}
// Save overlappingRect for each control child
refreshChildrenLastOverlappedRects( control, false );
if (control.SetValidityToRender()) {
revalidatedControls.Add(control);
}
addControlToRenderingUpdatedList(control);
}
示例2: processControl
private RenderingBuffer processControl(Control control, List<Control> revalidatedControls)
{
RenderingBuffer buffer = getOrCreateBufferForControl(control);
RenderingBuffer fullBuffer = getOrCreateFullBufferForControl(control);
//
LayoutInfo lastLayoutInfo = control.lastLayoutInfo;
LayoutInfo layoutInfo = control.layoutInfo;
//
control.Measure(lastLayoutInfo.measureArgument);
control.Arrange(lastLayoutInfo.renderSlotRect);
// if lastLayoutInfo eq layoutInfo we can use last rendered buffer
// if (layoutInfo.Equals(lastLayoutInfo) && lastLayoutInfo.validity == LayoutValidity.Render) {
if (checkRenderingWasNotChangedRecursively(control)) {
if (control.SetValidityToRender()) {
revalidatedControls.Add(control);
}
return fullBuffer;
}
// replace buffers if control has grown
if (layoutInfo.renderSize.width > buffer.Width || layoutInfo.renderSize.height > buffer.Height) {
buffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height);
fullBuffer = new RenderingBuffer(layoutInfo.renderSize.width, layoutInfo.renderSize.height);
buffers[control] = buffer;
fullBuffers[control] = fullBuffer;
}
// otherwise we should assemble full rendered buffer using childs
buffer.Clear();
if (control.RenderSize.Width != 0 && control.RenderSize.Height != 0)
control.Render(buffer);
//
fullBuffer.CopyFrom(buffer);
foreach (Control child in control.Children) {
if (child.Visibility == Visibility.Visible) {
RenderingBuffer fullChildBuffer = processControl(child, revalidatedControls);
fullBuffer.ApplyChild(fullChildBuffer, child.ActualOffset,
child.RenderSize, child.RenderSlotRect, child.LayoutClip);
} else {
// чтобы следующий Invalidate для этого контрола
// перезаписал lastLayoutInfo
if (child.SetValidityToRender()) {
revalidatedControls.Add(child);
}
}
}
// Save overlappingRect for each control child
refreshChildrenLastOverlappedRects( control, false );
if (control.SetValidityToRender()) {
revalidatedControls.Add(control);
}
return fullBuffer;
}