获取ListBox以使用窗口调整大小,但不调整内容大小

时间:2012-02-08 19:53:18

标签: wpf xaml listbox grid sizetocontent

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

如果我更改窗口的大小,我希望ListBox调整大小,但如果我添加的内容长于ListBox的宽度,我希望滚动条出现而不是它的增长,导致Window增长。如果我为Window设置了显式大小并将SizeToContent设置为Manual(默认值),则它可以按照我的意图运行。

有没有办法在启动时将窗口大小调整为内容并继续使ListBox随窗口大小增长而不是内容增长?

5 个答案:

答案 0 :(得分:4)

按照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的高度被限制在Border的高度。

希望能帮助其他任何有过这种令人沮丧的问题的人。

答案 1 :(得分:2)

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

答案 2 :(得分:1)

这是将SizeToContent属性设置为WidthAndHeight为described here所产生的预期行为。

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

答案 3 :(得分:0)

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

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

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

How can I get a vertical scrollbar in my ListBox?

答案 4 :(得分: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));
        }
    }
}