2012-02-08 60 views
12

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

如果我改变窗口的大小,我想要ListBox的大小,但如果我添加比ListBox的宽度更长的内容,我希望滚动条出现,而不是它增长,导致窗口成长。如果我为窗口设置了显式大小,并将SizeToContent设置为手动(默认),则按我的意图工作。

有什么方法可以在启动时调整窗口大小,并继续使窗口大小随窗口大小增长,但不随窗口大小增长?

+3

有同样的问题,但在一个网格内的高度可以通过GridSplitter进行调整。将项添加到列表框会增加列表框并移动网格分离器而不是滚动。 – 2012-09-07 02:20:43

回答

0

为了让列表框来调整,当你改变窗口的大小,只需使用:

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

为了使您的列表框滚动,你可以在这里找到答案,因为ListBox的默认模板包括ScrollViewer中。

How can I get a vertical scrollbar in my ListBox?

1

这是预期的行为是由于设置SizeToContent属性WidthAndHeight为described here

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

2

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

0

我希望你有以下要求, 1)列表框应该利用它的内容的大小的增长比原来更大的滚动条。

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)); 
     } 
    } 
} 
1

按照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> 

基本上,边境容器不当其内容的增加增长,但是会继续留拉伸到网格行的高度。网格行将填充容纳窗口允许的任何空间,但不会强制窗口上的任何高度限制。列表框的高度因此被限制在边框的高度。

希望能够帮助任何其他有这个有点令人沮丧的问题的人。