我在C#中创建一个自定义控件,并希望有一个包含ListBox的网格单元格,可以根据需要隐藏或显示。隐藏它很容易,我只是将宽度设置为零,但是当我想要显示它时,我需要知道ListBox想要使用的宽度。
我认为DesiredSize.Width会给我这个谷,但它总是为零,即使在调用Measure()之后也是如此。这是我用来显示ListBox的代码......
_lb.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
_lb.Width = _lb.DesiredSize.Width;
我是如何找到所需宽度的?
答案 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
。它将渲染到所需的宽度,但不会显示。然后你可以测量它并开始玩宽度。