代码之家  ›  专栏  ›  技术社区  ›  Dominic K

确保实际宽度在WPF中不等于0

  •  1
  • Dominic K  · 技术社区  · 16 年前

    所以我读过 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。

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

    2 回复  |  直到 13 年前
        1
  •  3
  •   Dave Clemmer manu    13 年前

    你将无法得到 ActualWidth . 因为,它不会在加载时更新。所以,你应该使用 TextBlock 或者是父母的责任 或 ActualHeight

    this.textBlock.Dispatcher.BeginInvoke((Action)(() =>
                {
                    textBlock = this.textBlock.ActualWidth;
                }));
    
        2
  •  5
  •   Ben Voigt    13 年前

    我不明白为什么你的代码会失败,因为使用加载的事件应该足够好了。根据 Object Lifetime Events

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

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

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