这个问题必须有一个优雅的解决方案,但我在网上找不到任何东西。我有一个网格,其中有一列和一行宽度/高度*,包含一个ListBox。我将Window SizeToContents设置为WidthAndHeight,以允许窗口为每个UI小部件/字体集调整大小。当我向ListBox添加项目时,它会调整大小,导致窗口增长。
如果我更改窗口的大小,我希望ListBox调整大小,但如果我添加的内容长于ListBox的宽度,我希望滚动条出现而不是它的增长,导致Window增长。如果我为Window设置了显式大小并将SizeToContent设置为Manual(默认值),则它可以按照我的意图运行。
有没有办法在启动时将窗口大小调整为内容并继续使ListBox随窗口大小增长而不是内容增长?
答案 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。
答案 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));
}
}
}