Получите фактическую ширину сетки WPF - PullRequest
6 голосов
/ 04 мая 2011

У меня есть окно WPF с сеткой:

<Grid Name="mainGrid">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="20*" />
    <ColumnDefinition Width="700*" />
    <ColumnDefinition Width="190*" />
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition Height="80" />
    <RowDefinition Height="220*" />
    <RowDefinition Height="450*" />
    <RowDefinition Height="160*" />
    <RowDefinition Height="30" />
  </Grid.RowDefinitions>
</Grid>

В коде ниже я добавляю стековую панель в 1-й столбец 2-й строки mainGrid, но я хочу, чтобы максимальная ширина стековой панели была шириной столбца 1 - 50 пикселей. Я наткнулся на stkPanel.Width = mainGrid.ColumnDefinitions(1).Width.ToString - 50, однако это будет ошибка с:

700 * не может быть преобразовано в двойное

Есть ли способ получить фактическую ширину столбца сетки, как он отображается на экране, чтобы использовать, как я хочу, или я должен установить отступы или подобное?

Спасибо

Мэтт

Ответы [ 4 ]

5 голосов
/ 04 мая 2011

У вас есть два свойства для Grid:

Grid g = new Grid();
double width1 = g.ActualWidth;
double width2 = g.RenderSize.Width;

Эти двое должны сделать свое дело, попробуйте

3 голосов
/ 04 мая 2011

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

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

3 голосов
/ 04 мая 2011

Оказывается, я был почти там. Вместо использования

stkPanel.Width = mainGrid.ColumnDefinitions [1] .Width.ToString - 50

Я должен был использовать

stkPanel.Width = mainGrid.ColumnDefinitions [1] .ActualWidth.ToString - 50

0 голосов
/ 28 июня 2016

Вы должны использовать ActualWidth и ActualHeight.Например:

stkPanel.Width = mainGrid.ColumnDefinitions[1].ActualWidth - 50;
...