2016-08-31 5 views
-1

У меня есть два элемента внутри WrapPanel, кнопка и другая WrapPanel. Кнопка имеет динамическую ширину. Проблема в том, что дочерний WrapPanel предполагает полную ширину родительского WrapPanel, переполненный вправо из-за кнопки слева от нее.WrapPanel ребенок с полной шириной родителя

WrapPanel overflowing

<WrapPanel Height="200" VerticalAlignment="Top" Orientation="Vertical"> 
     <Button x:Name="BookCover" Click="ChangeImageFile" Margin="10"> 
      button style and content 
     </Button> 
     <WrapPanel Margin="10"> 
      <TextBox Text="New Book"></TextBox> 
      <TextBox Text="Lorem ipsum dolor sit amet, eos iusto graece consetetur cu, an dicam nonumy volutpat qui, usu at nullam alienum. Est suas autem augue ad, integre vituperatoribus quo id, delicata gloriatur pro ei. Vel at nisl decore, ut eum altera commune. Nec at agam menandri, putant insolens suavitate ei mei, ea possim veritus mea. Nec nemore iuvaret detracto at, quodsi consectetuer pri id. Integre suscipit voluptua no pro, nonumes incorrupte ut mea. Delenit democritum vel in, quem tale everti vim id, id vis melius necessitatibus. Paulo signiferumque per te. Cu mei modus exerci partiendo, ad iudico adolescens mea, et stet integre civibus mea." TextWrapping="Wrap"></TextBox> 
     </WrapPanel> 
    </WrapPanel> 

Как я могу сделать это поместиться внутри окна?

+0

Почему WrapPanel для этого? вы должны быть в порядке, просто используя Grid. – Bolu

ответ

1

Как я уже сказал в комментарии, вы должны быть хорошо с помощью Grid что-то вроде:

<Window ...> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> <!--to fit to the content--> 
      <ColumnDefinition Width="*"/> <!--fill all the remaining--> 
     </Grid.ColumnDefinitions> 
     <Button x:Name="BookCover" Click="ChangeImageFile" Margin="10"> 
      button style and content 
     </Button> 
     <StackPanel Grid.Column="1" Margin="10"> 
      <TextBox Text="New Book"></TextBox> 
      <TextBox Text="Lorem ipsum dolor sit amet, eos iusto graece consetetur cu, an dicam nonumy volutpat qui, usu at nullam alienum. Est suas autem augue ad, integre vituperatoribus quo id, delicata gloriatur pro ei. Vel at nisl decore, ut eum altera commune. Nec at agam menandri, putant insolens suavitate ei mei, ea possim veritus mea. Nec nemore iuvaret detracto at, quodsi consectetuer pri id. Integre suscipit voluptua no pro, nonumes incorrupte ut mea. Delenit democritum vel in, quem tale everti vim id, id vis melius necessitatibus. Paulo signiferumque per te. Cu mei modus exerci partiendo, ad iudico adolescens mea, et stet integre civibus mea." TextWrapping="Wrap"></TextBox> 
     </StackPanel> 
    </Grid>  
</Window> 

Результат: result

+0

Работал. Использование столбцов сетки представляется более жизнеспособным вариантом, чем StackPanel. –

2

Вопрос, вероятно, вызван Orientation="Vertical". Согласно MSDN, Если для свойства Orientation установлено значение Horizontal, дочерний контент сначала формирует горизонтальные строки и при необходимости формирует вертикальные стопки строк. Если для свойства Orientation установлено значение Vertical, дочерний контент сначала помещается в вертикальный столбец, и если места недостаточно, происходит обертка и добавляются дополнительные столбцы в горизонтальном измерении.

Здесь вы установили Orientation to Vertical и не установили ширину по умолчанию для Wrappanel. Это вызывает проблему. Обертка происходит вертикально и заставляет дочерний контент перемещаться из видимой области. Либо определите постоянную ширину для обертки или установите ширину окна, как: Width="{Binding ElementName=Window, Path=Width}" или попробуйте рассмотреть удаление Orientation="Vertical".

EDIT Я включаю решение проблемы. Метод заключается в использовании Grid внутри родительской оболочки для равного разделения пространства между кнопкой и содержимым на 2 равных столбца. Проверьте, помогает ли это.

<WrapPanel Height="200" 
      VerticalAlignment="Top" 
      Orientation="Vertical"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Button x:Name="BookCover" 
       Grid.Column="0" 
       Margin="10" 
       Click="ChangeImageFile"> 
      button style and content 
     </Button> 
     <WrapPanel Grid.Column="1" Margin="10"> 
      <TextBox Text="New Book" /> 
      <TextBox Text="Lorem ipsum dolor sit amet, eos iusto graece consetetur cu, an dicam nonumy volutpat qui, usu at nullam alienum. Est suas autem augue ad, integre vituperatoribus quo id, delicata gloriatur pro ei. Vel at nisl decore, ut eum altera commune. Nec at agam menandri, putant insolens suavitate ei mei, ea possim veritus mea. Nec nemore iuvaret detracto at, quodsi consectetuer pri id. Integre suscipit voluptua no pro, nonumes incorrupte ut mea. Delenit democritum vel in, quem tale everti vim id, id vis melius necessitatibus. Paulo signiferumque per te. Cu mei modus exerci partiendo, ad iudico adolescens mea, et stet integre civibus mea." TextWrapping="Wrap" /> 
     </WrapPanel> 
    </Grid> 
</WrapPanel> 
+0

Элементы не выравниваются, как я хочу, если ориентация не горизонтальная. Спасибо, что указал на проблему. Еще не нашли решение (Константа ширина не вариант) –

+0

@AndreiIlie, проверьте мой ответ. – Bolu

+0

@AndreiIlie: Как предложил Болу, вы можете попробовать использовать сетку. Но сетка не может обеспечить то, что вы ожидаете от WrapPanel, который является таким же, как StackPanel, но он обертывает элементы соответственно размеру формы. Элемент управления на панели Wrap автоматически переключается на следующую строку, если размер формы изменяется. ** Но использование сетки ухудшит ситуацию. Дело в том, что кнопка находится внутри родителя, а остальная часть содержимого находится внутри дочернего элемента. Таким образом, используется только пробел, оставшийся после нажатия кнопки. Следовательно, лучше указать минимальную ширину для достижения того, что вам нужно. – ViVi

Смежные вопросы