Авторазмер и центральный текстовый блок внутри панели стека - PullRequest
2 голосов
/ 13 июня 2011

В настоящее время я работаю над динамической вставкой текстовых блоков в панели стека. Это нужно делать много раз, и нет никакого способа узнать заранее, каков будет размер 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 ]

1 голос
/ 14 июня 2011

Я решил пойти со следующим:

    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.Затем, изменив размеры окна просмотра, мы можем получить желаемую результирующую заливку.Единственное, что я хотел бы сделать, но не могу найти способ, это центрировать результирующий текст внутри масштабированного окна просмотра.Прямо сейчас он выровнен по левому краю, даже если в окне просмотра есть место слева.Я не уверен, в чем причина этого.

0 голосов
/ 13 июня 2011

На самом деле нет понятия вертикального центрирования с вертикально ориентированным StackPanel и горизонтального центрирования для горизонтально выровненного StackPanel.

A StackPanel занимает только столько места, сколько егосоставляющие элементы.

Возможно, вам придется взглянуть на другие панели макета в соответствии с вашими требованиями.

Звучит так, как будто вы можете центрировать StackPanel внутри Grid для достиженияцентрирование, но это не решает требование увеличения текста для заполнения доступного пространства.

0 голосов
/ 13 июня 2011

StackPanel укладывается вертикально, его размер в этом направлении зависит от дочерних элементов. Если бы все дочерние элементы были отцентрированы по вертикали, они перекрывались бы, вся концепция вертикального выравнивания в стеке не имеет смысла. Возможно, вы хотите установить VerticalAlignment самой StackPanel на Center.

0 голосов
/ 13 июня 2011

StackPanel начинает упорядочивать элементы управления сверху

Установите для высоты StackPanel значение Авто, а затем для параметра VerticalAlignmet в StackPanel значение "Центр"

...