На Mac OS X,
ESC .
циклически повторится через недавние аргументы на месте. Это: нажатие и выпуск ESC
, затем нажмите и выпуск .
(ключ периода). На Ubuntu я думаю, что это ALT+.
.
можно сделать это несколько раз, для возвращения через все недавние аргументы. Это отчасти похоже CTRL + R , но для аргументов только. Это также намного более безопасно, чем !!
или $!
, начиная с Вас видят , что Вы собираетесь получить перед фактическим выполнением команды.
Лучше всего написать собственный Canvas, в котором вы можете написать ArrangeOverride таким образом, чтобы он принимал 0,0 в качестве центра.
Обновление: я дал еще один комментарий в ответе ниже (@decasteljau). Я не рекомендую заимствовать из Canvas. Вы можете зайти из Panel и добавить два свойства Attached Dependancy Top и Left и поместить тот же код, который вы вставили выше. Также не нужен конструктор с LayoutTransform в нем. И не используйте какие-либо преобразования в коде панели, используйте правильную меру и упорядочение на основе DesiredSize панели, чтобы вы также могли получить хорошее поведение при изменении размера содержимого. Canvas не позиционирует элементы динамически при изменении размера Canvas.
Это было очень легко сделать. Я посмотрел на исходный код 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;
}
}
Нет необходимости создавать пользовательскую панель. Холст отлично подойдет. Просто оберните его в другой элемент управления (например, бордюр), отцентрируйте, дайте ему нулевой размер и переверните с помощью RenderTransform:
<Border>
<Canvas HorizontalAlignment="Center" VerticalAlignment="Center"
Width="0" Height="0"
RenderTransform="1 0 0 -1 0 0">
...
</Canvas>
</Border>
Вы можете сделать это, и все на холсте все равно будет отображаться, за исключением того, что (0,0) будет находиться в центре содержащего элемента управления (в данном случае, в центре бордюра) и +Y будет вверх, а не вниз.
Опять же, для этого нет необходимости создавать пользовательскую панель.
.