为什么ListBox的DesiredSize.Width始终为零?

时间:2014-07-14 17:39:15

标签: c# wpf listbox uielement

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

我认为DesiredSize.Width会给我这个谷,但它总是为零,即使在调用Measure()之后也是如此。这是我用来显示ListBox的代码......

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

我是如何找到所需宽度的?

1 个答案:

答案 0 :(得分:2)

如果您的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已添加到窗口/ usercontrol / grid中,上面的代码就会为227.53变量返回值width;使用我的默认字体系列和大小。

如果ListBox尚未添加到窗口中,或者其中没有任何项目,则会为0属性返回.DesiredSize.Width

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

启动时不要将宽度设置为0。最初保持宽度不变,将.Visibility设置为Hidden。它将渲染到所需的宽度,但不会显示。然后你可以测量它并开始玩宽度。