13

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

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

有没有办法在启动时根据内容调整窗口大小并继续让 ListBox 随窗口大小而不是其内容而增长?

4

5 回答 5

8

根据 Potecaru Tudor 的建议,我通过将 ListBox 包装在另一个容器中并将 ListBox 的高度绑定到容器的 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>

基本上,Border 容器在其内容增长时不会增长,但会一直拉伸到网格行的高度。网格行将填满包含窗口允许的任何空间,但不希望在窗口上强制任何高度限制。ListBox 的高度因此被限制为边框的高度。

希望对遇到这个令人沮丧的问题的其他人有所帮助。

于 2017-05-04T14:17:21.653 回答
2

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

于 2014-09-03T10:36:42.620 回答
1

这是将 SizeToContent 属性设置为 WidthAndHeight 所产生的预期行为,如此处所述

您可能要做的是将 ListBox 的 Width 和 Height 绑定到其容器的 ActualWidth 和 ActualHeight 属性,或者使用转换器并将它们直接绑定到 Window 的相应属性。

于 2013-03-20T11:44:00.213 回答
0

我希望你有以下要求,1) ListBox 应该使用滚动条,它的内容的大小比原来的大。

2) 如果窗口被调整大小,ListBox 应该随 Window 一起增长/收缩。

我用一个简单的例子尝试了同样的方法,请检查一下,如果它与您的要求不同,请告诉我,

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));
        }
    }
}
于 2014-11-24T03:52:41.243 回答
-1

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

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

要在 ListBox 中启用滚动,您可以在此处找到答案,因为 ListBox 的默认模板包含一个 ScrollViewer。

如何在 ListBox 中获得垂直滚动条?

于 2012-02-08T22:51:11.750 回答