使ListBox随窗口大小调整,但不随内容调整大小

14

这个问题一定有一个优雅的解决方案,但我在网上找不到任何信息。我有一个包含一个列和行,宽度/高度为*的网格,其中包含一个 ListBox。我将 Window 的 SizeToContent 设置为 WidthAndHeight,以允许窗口为每组 UI 小部件/字体调整大小至适当大小。当我向 ListBox 添加项目时,它会重新调整大小,导致窗口增长。

我希望如果我更改窗口的大小,ListBox 会自动调整大小,但如果我添加的内容超过 ListBox 的宽度,则要出现滚动条,而不是使其增长,从而导致 Window 增长。如果我为 Window 设置显式大小并将 SizeToContent 设置为手动 (默认值),它会按照我的意图工作。

是否有任何方法可以在启动时将窗口大小设置为内容,并继续使 ListBox 随着窗口大小而增长,但不随着其内容而增长呢?


3
有相同的问题,但是在一个高度可通过GridSplitter调整的网格内。将项目添加到列表框会使列表框增长并移动网格分隔器,而不是滚动。 - Dale
5个回答

8

根据Potecaru Tudor的建议,我通过将ListBox嵌套在另一个容器中,并将ListBox的Height绑定到容器的ActualHeight来解决了类似的问题。

以下是一段XAML代码片段可供参考:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Border x:Name="HeightHelperPanel" Grid.Row="0">
        <ListBox ItemsSource="{Binding Path=FileNameCollection}"
                 MinHeight="60"
                 Height="{Binding Path=ActualHeight, ElementName=HeightHelperPanel}"/>
    </Border>
</Grid>

基本上,边框容器在其内容增长时不会扩展,但它将保持拉伸到网格行的高度。 网格行将填充窗口允许的任何空间,但不想对窗口施加任何高度约束。 因此,ListBox的高度受到Border高度的限制。
希望这可以帮助其他遇到这个有点令人沮丧问题的人。

2

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

水平对齐方式为“拉伸”,垂直对齐方式为“拉伸”。

1
这是将SizeToContent属性设置为WidthAndHeight时的预期行为,如此处所述
你可以将ListBox的宽度和高度绑定到其容器的ActualWidth和ActualHeight属性上,或使用转换器并直接将它们绑定到窗口的相应属性上。

0
我希望您有以下需求, 1)如果ListBox的内容大小增长超过其原始大小,则应使用滚动条。
2)如果调整窗口大小,ListBox应随窗口一起增长/缩小。
我已经尝试了一个简单的示例,请检查一下,如果与您的要求不同,请告诉我,
XAML代码:
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock Text="I am in Main Grid"/>
        <ListBox Grid.Row="1" BorderBrush="BlueViolet" BorderThickness="5" Margin="10">
            <TextBlock Text="I am a ListBox"/>
            <Button Content="Add Height and Width of ListBox by 100 pixels" Click="Button_Click"/>
            <ListBoxItem Content="ListBoxItem" Background="AliceBlue" Margin="10" BorderBrush="Blue" Width="{Binding ListBoxWidth}" Height="{Binding ListBoxHeight}"/>
        </ListBox>
    </Grid>
</Window>

C# 代码:

public partial class MainWindow : Window,INotifyPropertyChanged
{
    private int m_ListBoxWidth = 350;

    public int ListBoxWidth
    {
        get { return m_ListBoxWidth; }
        set 
        {
            m_ListBoxWidth = value;
            OnPropertyChanged("ListBoxWidth");
        }
    }

    private int m_ListBoxHeight = 150;

    public int ListBoxHeight
    {
        get { return m_ListBoxHeight; }
        set 
        {
            m_ListBoxHeight = value; 
            OnPropertyChanged("ListBoxHeight"); 
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ListBoxWidth += 190;
        ListBoxHeight += 140;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

-1

要使ListBox在更改窗口大小时调整大小,只需使用以下代码:

<ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" .../>

为了在您的ListBox中启用滚动条,您可以在此处找到答案,因为ListBox的默认模板包括一个ScrollViewer。 如何在我的ListBox中获取垂直滚动条?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接