WPF: как сделать (0,0) в центре в Холсте

На Mac OS X,

ESC .

циклически повторится через недавние аргументы на месте. Это: нажатие и выпуск ESC, затем нажмите и выпуск . (ключ периода). На Ubuntu я думаю, что это ALT+..

можно сделать это несколько раз, для возвращения через все недавние аргументы. Это отчасти похоже CTRL + R , но для аргументов только. Это также намного более безопасно, чем !! или $!, начиная с Вас видят , что Вы собираетесь получить перед фактическим выполнением команды.

15
задан Community 23 May 2017 в 12:25
поделиться

3 ответа

Лучше всего написать собственный Canvas, в котором вы можете написать ArrangeOverride таким образом, чтобы он принимал 0,0 в качестве центра.

Обновление: я дал еще один комментарий в ответе ниже (@decasteljau). Я не рекомендую заимствовать из Canvas. Вы можете зайти из Panel и добавить два свойства Attached Dependancy Top и Left и поместить тот же код, который вы вставили выше. Также не нужен конструктор с LayoutTransform в нем. И не используйте какие-либо преобразования в коде панели, используйте правильную меру и упорядочение на основе DesiredSize панели, чтобы вы также могли получить хорошее поведение при изменении размера содержимого. Canvas не позиционирует элементы динамически при изменении размера Canvas.

5
ответ дан 1 December 2019 в 00:37
поделиться

Это было очень легко сделать. Я посмотрел на исходный код Canvas с помощью .NET Reflector и заметил, что реализация на самом деле очень проста. Единственное, что требовалось, - это переопределить функцию ArrangeOverride (...)

public class CartesianCanvas : Canvas
{
    public CartesianCanvas()
    {
        LayoutTransform = new ScaleTransform() { ScaleX = 1, ScaleY = -1 };
    }
    protected override Size ArrangeOverride( Size arrangeSize )
    {
        Point middle = new Point( arrangeSize.Width / 2, arrangeSize.Height / 2 );

        foreach( UIElement element in base.InternalChildren )
        {
            if( element == null )
            {
                continue;
            }
            double x = 0.0;
            double y = 0.0;
            double left = GetLeft( element );
            if( !double.IsNaN( left ) )
            {
                x = left;
            }

            double top = GetTop( element );
            if( !double.IsNaN( top ) )
            {
                y = top;
            }

            element.Arrange( new Rect( new Point( middle.X + x, middle.Y + y ), element.DesiredSize ) );
        }
        return arrangeSize;
    }
}
7
ответ дан 1 December 2019 в 00:37
поделиться

Нет необходимости создавать пользовательскую панель. Холст отлично подойдет. Просто оберните его в другой элемент управления (например, бордюр), отцентрируйте, дайте ему нулевой размер и переверните с помощью RenderTransform:

<Border>
  <Canvas HorizontalAlignment="Center" VerticalAlignment="Center"
          Width="0" Height="0"
          RenderTransform="1 0 0 -1 0 0">
    ...
  </Canvas>
</Border>

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

Опять же, для этого нет необходимости создавать пользовательскую панель.

.
27
ответ дан 1 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: