我正在用 C# 创建一个自定义控件,并希望有一个包含列表框的网格单元格,它可以根据需要隐藏或显示。隐藏它很容易,我只需将宽度设置为零,但是当我想显示它时,我需要知道 ListBox 想要使用的宽度。
我以为 DesiredSize.Width 会给我这个值,但它始终为零,即使在调用 Measure() 之后也是如此。这是我用来显示列表框的代码...
_lb.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
_lb.Width = _lb.DesiredSize.Width;
关于如何找到所需宽度的任何想法?
最佳答案
如果您的 ListBox
位于网格的单元格中,为该网格列命名。然后在代码中,您可以访问 .ActualWidth
该网格列的属性并使用该值来设置 ListBox
的宽度.
这当然假设您的网格列的宽度未设置为 Auto
,因为那仍然会给你一个 0
值(value)。
_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中,以上代码返回值227.53
对于 width
多变的;使用我的默认字体系列和大小。
如果ListBox
还没有被添加到窗口,或者里面没有任何项目,它将返回 0
对于 .DesiredSize.Width
属性(property)。
此外,如果 .Visibility
属性设置为 Collapsed
而不是 Hidden
, 宽度将为 0。
启动时不要将宽度设置为0。最初保留宽度,设置 .Visibility
至 Hidden
.它将渲染到所需的宽度,但不会显示。然后你可以测量它并开始调整宽度。
关于c# - 为什么 ListBox 的 DesiredSize.Width 始终为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24742447/