【问题标题】:Get ListBox to resize with window, but not resize with content让 ListBox 随窗口调整大小,但不随内容调整大小
【发布时间】:2012-02-08 19:53:17
【问题描述】:

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

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

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

【问题讨论】:

  • 有同样的问题,但在一个网格内,高度可通过 GridSplitter 调节。将项目添加到列表框会增大列表框并移动网格分割器而不是滚动。

标签: wpf xaml listbox grid sizetocontent


【解决方案1】:

按照 Potecaru Tudor 的建议,我通过将 ListBox 包装在另一个容器中并将 ListBox 的高度绑定到容器的 ActualHeight 解决了类似的问题。

这里有一个 XAML 代码 sn-p 来提供帮助:

<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 的高度因此被限制为边框的高度。

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

【讨论】:

    【解决方案2】:

    HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我希望你有以下要求, 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));
                }
            }
        }
        

        【讨论】:

          【解决方案5】:

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

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

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

          How can I get a vertical scrollbar in my ListBox?

          【讨论】:

            猜你喜欢
            • 2016-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-18
            • 2013-07-10
            • 1970-01-01
            • 1970-01-01
            • 2020-07-12
            相关资源
            最近更新 更多