我有一个 Grid
,其中两行的大小为 1:3;第一行将 MinHeight
设置为非零值。当我将 ListBox
放入第二行时,它的大小不受窗口边框的限制:
如果应用 MinHeight
(即,如果窗口很小),则会出现此问题。如果我将有问题的 ListBox
替换为 Button
,问题就会消失(按钮始终位于窗口边界内)。
MainWindow.xaml
<Window x:Class="WpfGridLayoutMinMax.MainWindow" x:Name="self"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300" MinHeight="200" MinWidth="200">
<Control.Resources>
<Style TargetType="ListBox">
<Setter Property="Margin" Value="4"/>
<Setter Property="ItemsSource" Value="{Binding Items, ElementName=self}"/>
</Style>
</Control.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*" MinHeight="100"/>
<RowDefinition Height="3*"/>
</Grid.RowDefinitions>
<ListBox Grid.Row="0"/>
<ListBox Grid.Row="1"/>
</Grid>
</Window>
MainWindow.xaml.cs
using System.Collections.Generic;
using System.Linq;
namespace WpfGridLayoutMinMax
{
public partial class MainWindow
{
public List<int> Items { get; set; }
public MainWindow ()
{
Items = Enumerable.Range(0, 20).ToList();
InitializeComponent();
}
}
}
问题:是什么导致了这个问题?如何让 ListBox
保持在窗口内容区域内?
最佳答案
每次内容太大时都会出现此问题(如果您设置的高度大于剩余空间,对于 Button 也是如此)。
不知道您是否喜欢我的解决方案,但我添加了一个额外的网格来测量剩余空间。不幸的是,无法直接从第二个 RowDefinition 获取 ActualHeight(它没有可用的值)。这就是为什么我又添加了一个控件(Dummy)的原因。现在您可以将 ListBox.MaxHeight
限制为 Dummy.ActualHeight 并且它保持在窗口内。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="100" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid x:Name="Dummy" Grid.Row="1" />
<Grid Grid.RowSpan="2">
<Grid.RowDefinitions>
<RowDefinition Height="1*" MinHeight="100"/>
<RowDefinition Height="3*" />
</Grid.RowDefinitions>
<ListBox Grid.Row="0" />
<ListBox Grid.Row="1" MaxHeight="{Binding ActualHeight, ElementName=Dummy}" />
</Grid>
</Grid>
关于c# - 当将 ListBox 放入具有 MinHeight 的行的 Grid 中时,它不会停留在 Window 边界内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19114343/