1

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

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

在这种情况textBlock_Loaded下,我有:

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

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

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

4

2 回答 2

5

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

话虽如此,我不明白为什么您的代码会失败,因为使用加载的事件应该足够好。根据对象生命周期事件MSDN 页面:

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

所以所有控件都应该设置它们的最终位置和大小值。还:

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

于 2010-08-22T21:38:45.500 回答
3

你将无法获得ActualWidth. 因为,它不会在加载时更新。因此,您应该使用TextBlockor 它的 Parent 的 Dispatcher 来获取ActualWidthor ActualHeight

this.textBlock.Dispatcher.BeginInvoke((Action)(() =>
            {
                textBlock = this.textBlock.ActualWidth;
            }));
于 2010-08-23T07:28:56.580 回答