2017-01-12 10 views
1

Я делаю приложение WPF с использованием C#, и я нахожусь в стадии разработки большего количества пользовательского интерфейса. У меня есть все мои компоненты, такие как TextBlocks и другие холсты внутри основного холста, но если я перетащил левую часть его, чтобы сделать больше места, он будет расширяться с правой стороны, то есть я должен все переместить. То же самое происходит, когда я пытаюсь расширить верх; Дно становится больше. У меня есть RenderTransformOrigin Canvas, установленный на 0,0, поэтому я не совсем уверен, что происходит. Любая помощь приветствуется. Спасибо!WPF Canvas распространяется только вправо?

+1

Что, вероятно, происходит в том, что вы просто увеличиваете ширину/высоту холста. Холст позиционирует все внутренне относительно своего верхнего левого угла. Изменение размера холста не приведет к изменению положения внутри него. – Abion47

+0

@ Abion47 Это звучит как возможное объяснение. Есть ли способ, по которому я могу перемещаться, где холст позиционирует все относительно? – user5721736

+0

Почему у вас есть основной холст? Для компоновки приложения есть гораздо более эффективные панели, такие как StackPanel, WrapPanel, Grid и т. Д. – Clemens

ответ

0

По умолчанию Canvas не имеет ширины или высоты, его фактический размер зависит от того, заданы ли эти свойства явно, или если вы установите HorizontalAlignment или VerticalAlignment на Stretch.

В любом случае, элементы внутри холста выровнены относительно его верхнего левого угла, за исключением, если вы явно установить их Canvas.Top, Canvas.Left, Canvas.Right и/или Canvas.Bottom свойства.

Вы также можете позиционировать элементы, содержащие геометрию (например, производные от Shape, путь, являющийся общим примером) по их абсолютным координатам геометрии. На самом деле это уже так, как они визуализируются.

Что касается Вашего комментария в вопросе, как правило, вы не изменить, где вещи выровнять относительно холста, так как это намного проще (я думаю, что даже рекомендуется), чтобы изменить сам холст, так что все в нем будет также переместить.

Общими способами сделать это будет добавление элементов к холсту, а затем положение этого холста внутри другого «родительского» холста, похожее на «группировку» в программах векторного дизайна, таких как CorelDraw/Inkscape/Illustrator.

Другой способ - использовать свойство RenderTransform холста, содержащего элементы, которые вы хотите переместить.

После того, как вы привыкли видеть Canvas как «систему координат», вы можете и должны думать о Canvas-inside-Canvas-inside-Canvas -... как способе иерархической группировки вещей, которые имеют одинаковое декартово пространство , в отличие от панелей и ContentControls, которые вложены внутри друг друга и обычно не могут совместно использовать пространство.

0

Как я уже сказал в своем комментарии, все элементы управления внутри холста расположены относительно верхней левой части холста. Если вы хотите, чтобы они сохранили свою «позицию», когда холст был изменен влево или вправо, вам придется самостоятельно их компенсировать. Вы можете сделать это с помощью метода полезности, которую вы называете, когда вы хотите изменить размер холста:

public static void StretchWidthLeft(Canvas canvas, double newWidth) 
{ 
    double diff = newWidth - canvas.Width; 
    canvas.Width = newWidth; 

    foreach (UIElement child in canvas.Children) 
    { 
     Canvas.SetLeft(child, Canvas.GetLeft(child) + diff); 
    } 
} 

public static void StretchHeightTop(Canvas canvas, double newHeight) 
{ 
    double diff = newHeight - canvas.Height; 
    canvas.Height = newHeight; 

    foreach (UIElement child in canvas.Children) 
    { 
     Canvas.SetTop(child, Canvas.GetTop(child) + diff); 
    } 
} 

Обратите внимание, что эти методы не репозиции самих холстов. Как вы это сделаете, это зависит от того, как родитель холста сохраняет свою позицию.