“Железные” рамки для контролов

243
19 апреля 2017, 10:19

Есть ли панель, в которую можно было бы запихнуть Control'ы, которые не смогут выходить за пределы этой панели, Margin которых будет отсчитываться от границ этой панели и при этом, эта панель должна быть "резиновой"?

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

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

Аналогично, вот тут я пытался понять почему ListView уходит за пределы окна и какой в этом смысл. А главное понять, как исправить поведение. К сожалению, никто не отреагировал на вопрос и я всё ещё в тупике.

Answer 1

Если я правильно понимаю, то вам нужно использовать Grid. StackPanel, которую вы скорей всего используете, бесконечна в ширину или высоту для внутренних элементов, она просто обрезает представление внутренних элементов, не влияя на их ширины/высоты, не вызывая trimming у TextBlock, например. Grid же позволяет настроить ширины/высоты строк/колонок как вам нравится.

Например:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <TextBlock Text="1 1" />
    <TextBlock Text="1 2 Эта колонка занимает всю оставшуюся ширину"
               Grid.Column="1"
               TextTrimming="CharacterEllipsis"/>
    <ListBox Grid.Row="1">
        <sys:String>2 1 Этот</sys:String>
        <sys:String>ListBox</sys:String>
        <sys:String>узкий</sys:String>
        <sys:String>но занимает</sys:String>
        <sys:String>всю оставшуюся</sys:String>
        <sys:String>высоту.</sys:String>
    </ListBox>
    <ListBox Grid.Row="1"
             Grid.Column="1">
        <sys:String>2 2 Этот</sys:String>
        <sys:String>ListBox</sys:String>
        <sys:String>широкий</sys:String>
        <sys:String>и высокий.</sys:String>
    </ListBox>
</Grid>

Стоит отметить, что по умолчанию у всех элементов Grid.Row и Grid.Column равны 0.

Попробуйте потаскать окно. TextBlock в верхней колонке будет тримиться, а у ListBox появятся скролы.

READ ALSO
Обновить Базу данных из datagridview

Обновить Базу данных из datagridview

Прошу прощения если повторяюсь, но что то не могу найти ответаесть таблица datagridview заполняется так :

354
c# Unity Поднятие предмета [требует правки]

c# Unity Поднятие предмета [требует правки]

Привет! Возникло затруднение

224
Как передать regex в Asp.Net MVC

Как передать regex в Asp.Net MVC

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

208