WPF DockPanel не учитывает желаемый размер “Заполненного” элемента управления

StackOverflow https://stackoverflow.com/questions/2403454

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть следующий Xaml (упрощенный для краткости, но я повторю проблему в Xamlpad или Kaxaml):

<DockPanel Width="400">
    <TextBlock DockPanel.Dock="Left" TextWrapping="Wrap">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.
        Vestibulum massa metus, ornare in fringilla nec, fringilla at orci.
        Nunc pharetra enim sit amet sapien aliquet eu euismod turpis vehicula.
        Aenean gravida tempus lectus ut ornare. 
            Nullam massa augue, suscipit vel consectetur fringilla, pretium vitae neque.
    </TextBlock>
    <Button MinWidth="100" VerticalAlignment="Center" HorizontalAlignment="Left">Hello world</Button>
</DockPanel>

Моя проблема в том, что я хочу, чтобы Кнопка занимала минимум 100 пикселей пространства, а текст должен быть соответствующим образом перенесен, чтобы оставить это пространство.Однако происходит то, что текст переносится как можно ближе к 400px, а затем кнопка обрезается.

Если я просмотрю выходные данные, я увижу, что кнопка отображается с желаемым разрешением 100 пикселей, но она обрезана сбоку от DockPanel.

Если я переверну док-станцию (чтобы кнопка была закреплена "Вправо", а текстовый блок заполнялся), то я получу желаемый макет, но, к сожалению, это невозможно из-за окружающего макета.

Есть ли что-то, что я могу сделать, что сделает DockPanel а) не обрезанной и б) компоновкой таким образом, чтобы учитывалась минимальная ширина?Или я застрял в поиске альтернативного механизма компоновки?

Заранее спасибо!

Это было полезно?

Решение

Ах, я тупой и слишком долго пялился на один и тот же код.Моим слишком простым решением было использовать сетку:

<Grid Width="400">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="Auto" />
  </Grid.ColumnDefinitions>
  <Button  Grid.Column="1" MinWidth="100" VerticalAlignment="Center" HorizontalAlignment="Left">Hello world</Button>
  <TextBlock TextWrapping="Wrap" Grid.Column="0">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit.
      Vestibulum massa metus, ornare in fringilla nec, fringilla at orci.
      Nunc pharetra enim sit amet sapien aliquet eu euismod turpis vehicula.
      Aenean gravida tempus lectus ut ornare. 
      Nullam massa augue, suscipit vel consectetur fringilla, pretium vitae neque.
  </TextBlock>
</Grid>

Прошу прощения за мой собственный глупый вопрос!

Другие советы

Вы должны закрепить кнопку справа, а остальное пусть заполнит текстовый блок.Вот соответствующий xaml:

<DockPanel Width="400">
    <Button DockPanel.Dock="Right" MinWidth="100" VerticalAlignment="Center" HorizontalAlignment="Left">Hello world</Button>
    <TextBlock TextWrapping="Wrap">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.
        Vestibulum massa metus, ornare in fringilla nec, fringilla at orci.
        Nunc pharetra enim sit amet sapien aliquet eu euismod turpis vehicula.
        Aenean gravida tempus lectus ut ornare. 
        Nullam massa augue, suscipit vel consectetur fringilla, pretium vitae neque.
    </TextBlock>
</DockPanel>

С наилучшими пожеланиями,
Оливер Ханаппи

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top