2012-02-08 61 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> 

基本上,邊境容器不當其內容的增加增長,但是會繼續留拉伸到網格行的高度。網格行將填充容納窗口允許的任何空間,但不會強制窗口上的任何高度限制。列表框的高度因此被限制在邊框的高度。

希望能夠幫助任何其他有這個有點令人沮喪的問題的人。