为什么ListBox's DesiredSize.宽度总是零

本文关键字:DesiredSize ListBox 为什么 | 更新日期: 2023-09-27 18:13:06

我正在c#中创建一个自定义控件,并希望有一个包含ListBox的网格单元格,可以根据需要隐藏或显示。隐藏它很容易,我只是将宽度设置为零,但是当我想显示它时,我需要知道ListBox想要使用的宽度。

我认为DesiredSize。Width会给我这个值,但它总是零,即使在调用Measure()之后。下面是我用来显示ListBox的代码…

_lb.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
_lb.Width = _lb.DesiredSize.Width;

任何想法我如何找到所需的宽度?

为什么ListBox's DesiredSize.宽度总是零

如果您的ListBox位于网格的单元格中,则为该网格列指定一个名称。然后在代码中,您可以访问该网格列的.ActualWidth属性并使用该值来设置ListBox的宽度。

当然,假设您的网格列的宽度没有设置为Auto,因为这仍然会给您一个0值。

_lb.Width = myGridColumn.ActualWidth

你可能需要从列宽中减去一点,以使你的控件适合。

编辑

我发现的一件事是ListBox必须有项目添加到它之前,它将返回0以外的任何东西,当它被测量。

string myItem = "Don't ask for a bath in Athabaska";
_lb.Items.Add(myItem);
_lb.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
double width = _lb.DesiredSize.Width;

只要ListBox已经被添加到window/usercontrol/grid中,上面的代码就会为width变量返回227.53的值;使用我的默认字体系列和大小。

如果ListBox没有被添加到窗口中,或者它没有任何项目,它将为.DesiredSize.Width属性返回0

同样,如果将.Visibility属性设置为Collapsed而不是Hidden,则宽度将为0。

开始时不要将宽度设置为0。最初保持宽度不变,将.Visibility设置为Hidden。它将呈现所需的宽度,但不会显示。然后你可以测量它,并开始摆弄宽度