c# - 当将 ListBox 放入具有 MinHeight 的行的 Grid 中时,它不会停留在 Window 边界内

标签 c# wpf xaml listbox grid

我有一个 Grid,其中两行的大小为 1:3;第一行将 MinHeight 设置为非零值。当我将 ListBox 放入第二行时,它的大小不受窗口边框的限制:

Screenshot

如果应用 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/

相关文章:

c# - 如何在 Xamarin.Forms 的选取器中显示 ItemDisplayBinding 中的默认枚举值

c# - 如何以强类型方式动态获取特定方法的名称?

c# - 使用 Visuals 将 WPF 控件 (ComboBox) 放入 Canvas 中

.net - WPF:如何根据 XAML 中另一个的 Text 属性更改文本框的前景色?

xaml - XAML (WPF) 中的依赖注入(inject)

wpf - 使用字符串文字在标签上绑定(bind)字符串格式

c# - 在扩展方法 (C#) 中获取类型成员的简单语法

c# - 适用于 Android 的 Datepicker DialogFragment 单声道

c# - Graphics.DrawString() 的中心文本输出

c# - 使用 MvvmLight.Messaging.Messenger 实例化新的 View + ViewModel (Window)