Получить фактическую ширину сетки WPF

У меня есть окно 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* не может быть преобразовано в двойное

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

Спасибо,

Мэтт


person Lima    schedule 04.05.2011    source источник


Ответы (4)


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

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

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

person Damascus    schedule 04.05.2011

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

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

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

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

person Lima    schedule 04.05.2011

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

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

person Rick Sladkey    schedule 04.05.2011

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

stkPanel.Width = mainGrid.ColumnDefinitions[1].ActualWidth - 50;
person ste    schedule 28.06.2016