【问题标题】:Ensuring ActualWidth does not equal 0 in WPF确保 WPF 中的 ActualWidth 不等于 0
【发布时间】:2010-08-22 21:30:51
【问题描述】:

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

【问题讨论】:

    标签: c# wpf actualwidth


    【解决方案1】:

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

    话虽如此,我不明白为什么您的代码会失败,因为使用加载的事件应该足够好。根据Object Lifetime EventsMSDN 页面:

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

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

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

    【讨论】:

    • 我认为它失败了,因为 TextBlock 的加载事件触发了 我在 Main() 中使用它的代码。
    • 也许“计算了所有必要的渲染值”意味着只计算了 DesiredSize?
    • @HCL - 可能是。我在该页面或链接上找不到更多相关信息可以完全解释这一点。
    • 你能告诉我应该如何存储对控件的引用吗?
    • @Dave:在 3 岁的答案中引入拼写错误没有帮助。
    【解决方案2】:

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

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

    【讨论】:

    • 我已经尝试过这样的方法 - 但我的问题是它永远不会在我需要时加载。在我的 main 中调用它并将 ActualWidth 设置为一个变量后,我继续使用这个变量(在我的 main 方法中)。它仍然会返回零,因为它还没有加载。
    • 它应该可以工作。您可以尝试使用父窗口调度程序,而不是控件的调度程序。这将有助于它看起来。比如,this.Dispatcher.BeginInvoke((Action)...stackoverflow.com/questions/2452246/…
    • 嗨 DMan,我试过这样,在窗口 Loaded 事件内一切都很好。 ` this.Loaded += (s, e) => { this.Dispatcher.BeginInvoke((Action)(() => { Console.WriteLine(this.textBlock.ActualWidth); Console.WriteLine("Her"); } )); }; `
    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多