2012-02-08 19 views
12

この問題は優雅な解決策である必要がありますが、オンラインでは何も見つかりません。私はListBoxを含む幅と高さ*の列と行を持つグリッドを持っています。ウインドウのSizeToContentsをWidthAndHeightに設定して、UIウィジェット/フォントの各セットに対して適切なサイズにウィンドウのサイズを変更できるようにしました。 ListBoxに項目を追加すると、サイズが変更され、ウィンドウが拡大します。ListBoxでウィンドウのサイズを変更しますが、コンテンツのサイズは変更しません。

ウィンドウのサイズを変更するとListBoxのサイズを変更したいが、ListBoxの幅よりも長いコンテンツを追加すると、スクロールバーが表示され、ウィンドウが拡大しないようにしたい成長する。私は、ウィンドウの明示的なサイズを設定し、SizeToContentをManual(デフォルト)に設定すると、意図どおりに動作します。

起動時にウィンドウをコンテンツのサイズに合わせる方法はありますか?リストボックスはウィンドウサイズで拡大しますが、コンテンツでは拡大しないでください。あなたは、ウィンドウのサイズを変更するときにサイズを変更するために、リストボックスを作るために

+3

も同じ問題がありますが、GridSplitterで高さを調整できるグリッド内です。リストボックスに項目を追加すると、リストボックスが大きくなり、スクロールせずにグリッドスプリッターが移動します。 –

答えて

0

だけ使用します。

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

あなたのListBoxでのスクロール可能にするには、リストボックスのデフォルトのテンプレートがScrollViewerのが含まれているため、あなたがここで答えを見つけることができます。

How can I get a vertical scrollbar in my ListBox?

1

これは意図した動作がdescribed hereとしてWidthAndHeightにSizeToContentプロパティを設定から生じています。

ListBoxの幅と高さをコンテナのActualWidthプロパティとActualHeightプロパティにバインドするか、コンバーターを使用してウィンドウのそれぞれのプロパティに直接バインドします。

2

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

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

Potecaru Tudorの提案にしたがって、別のコンテナにListBoxをラップし、ListBoxの高さをコンテナのActualHeightにバインドすることで同様の問題を解決しました。

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

を基本的には、その内容が大きくなるとボーダーコンテナが成長しないが、それはグリッド行の高さに伸ばしたままになります。ここでは

は助けるためにXAMLコードスニペットです。グリッド行は、格納するウィンドウで許可されているすべてのスペースを埋めるが、ウィンドウに高さの制約を強制したくない。したがって、リストボックスの高さはボーダーの高さに制限されます。

これはやや不満な問題を抱えている他の誰にも役立ちます。

関連する問題