【问题标题】:Why is the ListBox's DesiredSize.Width always zero?为什么 ListBox 的 DesiredSize.Width 总是为零?
【发布时间】:2014-07-14 17:39:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我建议使用:_lb.Visible = false; 隐藏它,使其可见:_lb.Visible = true;。列表框应该有多大,是否有静态值,或者它必须与另一个组件具有相同的宽度?
  • 我想设置实际宽度,这样我可以在显示或隐藏它时对其进行动画处理。我没有宽度的静态值,如果列表框具有所需的所有空间,我想获取列表框的宽度。
  • 列表框是否在容器中,如表单或面板?如果有,它是如何调用的,是一种什么样的控件?
  • 我创建了一个继承自 UserControl 的类,并覆盖了 OnInitialized 事件。在那里,我创建了一个 Grid,它被设置为我的控件的 Content 属性。我像在 XAML 中一样设置网格及其子控件,只是我必须编写 C# 来代替。这有帮助吗?不知道你在做什么。
  • 考虑创建一个Custom Panel,它仅支持具有 ScaleX 依赖属性的单个子级。它可以测量其单个子元素并为其提供等于 ScaleX*DesiredWidth 的宽度(这与它应该为其所有者容器提供的宽度与其自己的 DesiredWidth 相同。)如果您随后为 ScaleX 属性设置动画,它将导致重复的布局更新将孩子适当地重新缩放到最终所需的宽度。

标签: c# wpf listbox uielement


【解决方案1】:

如果您的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。它将渲染到所需的宽度,但不会显示。然后你可以测量它并开始调整宽度。

【讨论】:

  • 感谢您的建议,但网格列的宽度设置为自动,因此当我为列表框的宽度设置动画时,网格列会适当调整大小。我想不出任何其他方式来做到这一点。我无法为网格列本身设置动画,因为我在列顶部有一个按钮,用于显示/隐藏列表框,我需要保持它可见。还有其他建议吗?
  • 如果您知道列表框中某些内容的大小,您可以使用它来确定列表框的宽度。
  • 我都设置为自动,以便列表框的内容可以确定宽度。我如何找到内容的大小?它们都是纯字符串。
  • 刚刚注意到您的编辑。我遇到的问题是列表框最初是隐藏的,只有在用户单击按钮时才可见。因此,当代码运行测量宽度时,它总是会返回零。我能看到这一点的唯一方法是首先让列表框可见,这不是所需的行为。有什么想法吗?
  • 不要将宽度设置为 0。最初不考虑宽度,将可见性设置为隐藏。它将渲染到所需的宽度,但不会显示。然后你可以测量它并开始调整宽度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多