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

#wpf #grid #width #stackpanel

#wpf #сетка #ширина #stackpanel

Вопрос:

У меня есть окно 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>
  

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

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

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

Спасибо,

Мэтт

Ответ №1:

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

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

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

Ответ №2:

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

stkPanel.Width = основная сетка.Определения столбцов[1].Ширина.toString — 50

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

stkPanel.Width = основная сетка.Определения столбцов[1].Фактическая ширина.toString — 50

Ответ №3:

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

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

Ответ №4:

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

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