#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;