WPF DockPanel не учитывает желаемый размер элемента управления Filled

У меня есть следующий 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 пикселей пространства, а текст переносился соответствующим образом, чтобы оставить это пространство. Однако происходит то, что текст переносится как можно ближе к 400 пикселям, а затем кнопка обрезается.

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

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

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

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


person Dan Puzey    schedule 08.03.2010    source источник


Ответы (2)


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

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

Извиняюсь за свой глупый вопрос!

person Dan Puzey    schedule 09.03.2010

Вы должны закрепить кнопку справа и позволить текстовому блоку заполнить все остальное. Вот соответствующий 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>

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

person Oliver Hanappi    schedule 08.03.2010
comment
Как прямо указано в моем вопросе (выделение добавлено): если я переверну док-станцию ​​(чтобы кнопка была закреплена справа, а текстовый блок заполнялся), я получаю нужный макет, но, к сожалению, это не вариант из-за окружающего макета . - person Dan Puzey; 08.03.2010
comment
Значит, на док-панели есть другие элементы управления? Можете ли вы показать нам xaml со всеми элементами управления? И извините, что перечитал эту строчку ;) - person Oliver Hanappi; 08.03.2010
comment
Нет, в DockPanel нет других элементов управления, но мне нужно, чтобы кнопка смыкалась с краем текстового элемента, даже если текст минимальный. Я мог бы использовать StackPanel, за исключением того, что StackPanel будет переполнять размер родительского элемента управления, когда содержимое слишком велико... - person Dan Puzey; 08.03.2010
comment
Извините, но я все еще не понимаю. Какова точная причина того, что окружающий макет не позволяет использовать мое решение? - person Oliver Hanappi; 09.03.2010