WPF переносят панель и прокрутку

У меня есть простое WrapPanel который содержит много широких средств управления. Когда я изменяю размер Width из Window все работает как ожидалось. Средства управления пойдут через на одной строке, если будет достаточно пространства, или перенеситесь вниз к следующей строке, когда нет.

Однако то, что я должен произойти, то, что, если все средства управления в основном сложены вертикально (так как больше нет горизонтального пространства), и Width из Window уменьшен еще больше, горизонтальная полоса прокрутки появляется так, чтобы я мог прокрутить и видеть все управление, если я хочу. Ниже мой xaml. Я пытался перенестись WrapPanel в a ScrollViewer но я не мог достигнуть своей цели.

<Window x:Class="WpfQuotes.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="Auto" Width="600" Foreground="White">
    <WrapPanel>
      <Button Width="250">1</Button>
      <Button Width="250">2</Button>
      <Button Width="250">3</Button>
    </WrapPanel>
</Window>

Таким образом, если Вы уменьшаете Width из вышеупомянутого Window к его минимуму Вы не сможете видеть текст кнопок. Я хотел бы горизонтальную полосу прокрутки, появляются так, чтобы я мог прокрутить, чтобы видеть текст, но не вмешаться в обычную функциональность обертывания.

Спасибо.

Обновление: Я следовал за предложением Paul ниже, и горизонтальная полоса прокрутки появляется как ожидалось теперь. Однако я также хотел вертикальную прокрутку, доступную, таким образом, я установил VerticalScrollBarVisibility="Auto". Вещь, если я изменяю размер окна так, чтобы вертикальная полоса прокрутки появилась, горизонтальный также всегда появляется, даже если это не нужно (существует достаточно горизонтального пространства для наблюдения всего управления). Кажется, что вертикальное появление полосы прокрутки смешивает с шириной scrollviewer. Существует ли способ исправить это так, чтобы горизонтальная полоса прокрутки не появлялась, если это не на самом деле необходимо?

Ниже мой xaml и единственный код, который я включил CustomWrapPanel:

<Window x:Class="Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cwp="clr-namespace:CustomWrapPanelExample"
        Title="Window1" Height="Auto" Width="300" Foreground="White" Name="mainPanel">
  <ScrollViewer x:Name="MyScrollViewer" HorizontalScrollBarVisibility="Auto"
                VerticalScrollBarVisibility="Auto">
    <cwp:CustomWrapPanel Width="{Binding ElementName=MyScrollViewer, Path=ActualWidth}">
      <Button Width="250">1</Button>
      <Button Width="250">2</Button>
      <Button Width="250">3</Button>
      <Button Width="250">4</Button>
      <Button Width="250">5</Button>
      <Button Width="250">6</Button>
      <Button Width="250">7</Button>
      <Button Width="250">8</Button>
      <Button Width="250">9</Button>
    </cwp:CustomWrapPanel>
  </ScrollViewer>
</Window>

Единственная вещь, переопределенная в CustomWrapPanel:

protected override Size MeasureOverride(Size availableSize)
{
  double maxChildWidth = 0;
  if (Children.Count > 0)
  {
    foreach (UIElement el in Children)
    {
      if (el.DesiredSize.Width > maxChildWidth)
      {
        maxChildWidth = el.DesiredSize.Width;
      }
    }
  }      
  MinWidth = maxChildWidth;
  return base.MeasureOverride(availableSize);
}
21
задан Dave Clemmer 17 September 2011 в 00:18
поделиться

1 ответ

Вот вещь, если вы собираетесь использовать панель обертывания Он делает две вещи, он займет как можно больше места в одном направлении, и расширяется по мере необходимости в другом. Например, если вы размещаете его внутри окна, как у вас есть, он занимает столько горизонтального пространства, как это может, а затем расширяется по мере необходимости вниз, поэтому будет работать вертикальная полоса прокрутки, родительский контейнер говорит: «Это Как широко я, но вы можете сделать себя так же большим, как вы хотите вертикально «, если вы измените его в горизонтальную полосу прокрутки, просмотра прокрутки, по сути, - это то, насколько вы можете быть, но вы можете быть настолько шире Вы хотите «в этом случае панель обертывания не обернут, потому что нет горизонтальных ограничений.

Одним из потенциальных растворов состоит в том, чтобы изменить направление обернуть панель из горизонтали до вертикали, подобное этому (что, вероятно, не является идеальным или ожидаемым поведением):

    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
        <WrapPanel Orientation="Vertical">
            <Button Width="250">1</Button>
            <Button Width="250">2</Button>
            <Button Width="250">3</Button>
        </WrapPanel>
    </ScrollViewer>

, чтобы получить поведение вашего ожидания, вам придется Сделайте что-нибудь ближе к этому:

    <ScrollViewer x:Name="MyScrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
        <WrapPanel MinWidth="250" Width="{Binding ElementName=MyScrollViewer, Path=ViewportWidth}">
            <Button Width="250">1</Button>
            <Button Width="250">2</Button>
            <Button Width="250">3</Button>
        </WrapPanel>
    </ScrollViewer>

Однако это второе решение работает только в том случае, если вы уже знаете ширину элементов вашего дочерних элементов, в идеале вы хотите, чтобы ваша максимальная ширина должна быть установлена ​​на фактическую ширину самого большого ребенка, но для того, чтобы Сделайте, вам придется создать пользовательский элемент управления, который вытекает из Praph Panel, и написать код самостоятельно, чтобы проверить это.

51
ответ дан 29 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: