У меня есть простой WrapPanel
, который содержит ряд широких элементов управления. Когда я изменяю размер Width
из Window
, все работает как положено. Элементы управления будут отображаться в одной строке, если места достаточно, или переходить к следующей строке, если ее нет.
Однако, что мне нужно сделать, так это то, что если все элементы управления в основном расположены вертикально (поскольку больше нет горизонтального пространства), а Width
в Window
еще больше уменьшается, появляется горизонтальная полоса прокрутки так что я могу прокручивать и видеть весь контроль, если я хочу. Ниже мой xaml. Я попытался обернуть WrapPanel
в 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
до минимума, вы не сможете видеть текст кнопок. Мне бы хотелось, чтобы появилась горизонтальная полоса прокрутки, чтобы я мог прокручивать текст, но не мешал обычной функции переноса.
Спасибо.
Обновление:
Я последовал предложению Пола ниже, и горизонтальная полоса прокрутки теперь выглядит, как и ожидалось. Однако я также хотел, чтобы была доступна вертикальная прокрутка, поэтому я установил VerticalScrollBarVisibility="Auto"
. Дело в том, что если я изменю размер окна так, чтобы появилась вертикальная полоса прокрутки, горизонтальная также всегда появляется, даже если она не нужна (достаточно горизонтального пространства, чтобы увидеть весь элемент управления). Кажется, что вертикальная полоса прокрутки пересекается с шириной прокрутки. Есть ли способ исправить это так, чтобы горизонтальная полоса прокрутки не появлялась, если она действительно не нужна?
Ниже мой 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);
}