我有一个简单的WrapPanel
,其中包含许多宽度较大的控件。当我调整Window
的宽度时,一切都按预期工作。如果有足够的空间,控件将在单行上横跨,否则将折叠到下一行。
然而,我需要的是,如果所有控件基本上垂直堆叠(因为没有更多的水平空间),并且Window
的Width
被进一步减小,那么会出现一个水平滚动条,以便我可以滚动并查看整个控件。以下是我的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
减小到最小,你将看不到按钮的文本。我希望出现水平滚动条,这样我就可以滚动查看文本,但不会干扰常规换行功能。谢谢。
更新: 我按照Paul下面的建议进行了操作,水平滚动条如预期般出现了。然而,我还想要垂直滚动可用,所以我设置了
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);
}