Авторазмер и центральный текстовый блок внутри панели стека
В настоящее время я работаю над динамической вставкой текстовых блоков в панели стека. Это должно быть сделано много раз, и нет никакого способа узнать заранее, каков будет размер Stackpanel.
В настоящее время у меня есть что-то вроде этого:
TextBlock tmp = new TextBlock {
Text = curField.FieldName,
Foreground = new SolidColorBrush(Colors.Red),
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
};
tmp.MouseLeftButtonUp += imgFormImage_MouseLeftButtonUp;
curField.assocStackpanel.Children.Add(tmp);
curField.assocStackpanel = curField.assocStackpanel;
SelectedFields.Add(curField);
Прямо сейчас текстовый блок просто отображается по центру горизонтально в стеке, но не вертикально. Так что мне нужно это исправить. Кроме того, в идеале я хотел бы иметь возможность динамически определять размер шрифта текстового блока, чтобы он занимал доступное пространство. Прямо сейчас я думаю, что это просто берет по умолчанию (я полагаю) 10.
4 ответа
Я решил пойти со следующим:
double xpos = Canvas.GetLeft(curField.assocGrid);
double ypos = Canvas.GetTop(curField.assocGrid);
double width = curField.assocGrid.Width;
double height = curField.assocGrid.Height;
TextBlock tmp = new TextBlock {
Text = curField.FieldName,
Foreground = new SolidColorBrush(Colors.Red),
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
FontSize = 30
};
Grid grd = new Grid();
grd.Children.Add(tmp);
Viewbox vb = new Viewbox();
vb.Child = grd;
vb.Width = width;
vb.Height = height;
cvsCenterPane.Children.Add(vb);
Canvas.SetLeft(vb, xpos);
Canvas.SetTop(vb, ypos);
curField.scaleViewbox = vb;
SelectedFields.Add(curField);
Сначала оборачивая текстовый блок в сетку, а затем оборачивая получившуюся сетку в окне просмотра. Мы получаем начальный масштаб 1:1. Затем, изменив размеры окна просмотра, мы можем получить желаемую результирующую заливку. Единственное, что я хотел бы сделать, но не могу найти способ, это центрировать результирующий текст внутри масштабированного окна просмотра. Прямо сейчас он выровнен по левому краю, даже если в окне просмотра есть место слева. Я не уверен, в чем причина этого.
StackPanel начинает организовывать управление сверху
Установите для высоты StackPanel значение "Авто", а затем установите для параметра "VerticalAlignmet" для StackPanel значение "Центр".
StackPanel укладывается вертикально, его размер в этом направлении зависит от дочерних элементов. Если бы все дочерние элементы были центрированы вертикально, они бы перекрывались, вся концепция вертикального выравнивания в стеке не имеет смысла. Вы, вероятно, хотите установить VerticalAlignment
самой StackPanel для Center
,
Существует не совсем концепция вертикального центрирования с вертикально ориентированной StackPanel
ни горизонтальное центрирование для горизонтально выровненного StackPanel
,
StackPanel
занимает только столько места, сколько его составляющие элементы.
Возможно, вам придется посмотреть на другие панели макета для ваших требований.
Похоже, вы сможете центрировать StackPanel
сам внутри Grid
чтобы добиться центрирования, но это не решает требование увеличения текста для заполнения доступного пространства.