确保WPF中的ActualWidth不等于0

时间:2010-08-22 21:30:51

标签: c# wpf actualwidth

所以我读过ActualWidth可能等于0,直到满载为止。我添加了它的事件处理程序,以确保它已完全加载:

text.AddHandler(TextBlock.LoadedEvent, new RoutedEventHandler(textBlock_Loaded));

textBlock_Loaded事件中,我有:

TextBlock tb = sender as TextBlock;
textBlockWidth = tb.ActualWidth;

我需要在main方法中使用变量textBlockWidth,但每次我在main方法中将textBlockWidth的值写入输出时,我得到0.

所以这个问题,在执行操作之前,如何确保ActualWidth不为0?由于WPF是事件驱动的,有没有一种方法可以在完成时触发某些方法,而不是之前?否则,它将返回0.

2 个答案:

答案 0 :(得分:5)

为什么存储实际宽度?为什么不存储对控件的引用并在真正需要时获得实际宽度?

说过我不明白为什么你的代码失败因为使用加载的事件应该足够好了。根据{{​​3}} MSDN页面:

  

在最终渲染之前引发Loaded事件,但在布局系统计算了所有必要的渲染值之后。

因此所有控件都应设置其最终位置和大小值。也:

  

Loaded事件在整个元素树(特别是逻辑树)中作为协调工作引发。当树中的所有元素都处于被认为已加载的状态时,首先在根元素上引发Loaded事件。然后,在每个子元素上连续引发Loaded事件。

答案 1 :(得分:3)

您将无法获得ActualWidth。因为,它在加载时不会更新。因此,您应该使用TextBlock或其父级的Dispatcher来获取ActualWidthActualHeight

this.textBlock.Dispatcher.BeginInvoke((Action)(() =>
            {
                textBlock = this.textBlock.ActualWidth;
            }));