Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确保WPF中的实际宽度不等于0_C#_Wpf_Actualwidth - Fatal编程技术网

C# 确保WPF中的实际宽度不等于0

C# 确保WPF中的实际宽度不等于0,c#,wpf,actualwidth,C#,Wpf,Actualwidth,所以我读到,实际宽度可能等于0,直到它完全加载。我添加了它的事件处理程序,如下所示,以确保它已完全加载: text.AddHandler(TextBlock.LoadedEvent, new RoutedEventHandler(textBlock_Loaded)); 在加载的textBlock_事件中,我有: TextBlock tb = sender as TextBlock; textBlockWidth = tb.ActualWidth; 我需要在main方法中使用变量textBlo

所以我读到,
实际宽度
可能等于0,直到它完全加载。我添加了它的事件处理程序,如下所示,以确保它已完全加载:

text.AddHandler(TextBlock.LoadedEvent, new RoutedEventHandler(textBlock_Loaded));
在加载的
textBlock_
事件中,我有:

TextBlock tb = sender as TextBlock;
textBlockWidth = tb.ActualWidth;
我需要在main方法中使用变量
textBlockWidth
,但每次我在main方法中写入textBlockWidth的值以输出时,我得到0


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

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

尽管如此,我不明白为什么您的代码会失败,因为使用加载的事件应该足够好了。根据MSDN页面:

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

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

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


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

尽管如此,我不明白为什么您的代码会失败,因为使用加载的事件应该足够好了。根据MSDN页面:

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

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

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


您将无法获取
实际宽度
。因为,它不会在加载时更新。因此,您应该使用
TextBlock
的Dispatcher或它的父对象来获取
ActualWidth
ActualHeight

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

您将无法获取
实际宽度
。因为,它不会在加载时更新。因此,您应该使用
TextBlock
的Dispatcher或它的父对象来获取
ActualWidth
ActualHeight

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

我认为它失败是因为TextBlock的加载事件在使用它的Main()中的代码之后触发。也许“计算了渲染所需的所有值”意味着只计算了DesiredSize?@HCL-可能是。我在那个页面上找不到更多的相关信息或链接来充分解释这一点。你能告诉我应该如何存储对控件的引用吗?@Dave:在3年前的答案中引入拼写错误是没有帮助的。我认为它失败了,因为TextBlock的加载事件在我使用它的Main()中的代码之后触发。也许吧“已计算渲染所需的所有值“意味着只计算了DesiredSize?@HCL-可以是。我在那个页面上找不到更多的相关信息,也找不到能充分解释这一点的链接。你能告诉我应该如何存储对控件的引用吗?@Dave:在3年前的答案中引入拼写错误是没有帮助的。我已经尝试过这样的方法,但我的问题是,在我需要时,它永远不会被加载。在我在main中调用它并将ActualWidth设置为一个变量之后,我继续使用这个变量(在我的main方法中)。它仍然会返回零,因为它仍然没有加载。它应该可以工作。请尝试父windows dispatcher,而不是control的dispatcher。这将有助于它看起来更好。例如,this.Dispatcher.BeginInvoke((操作)…嗨,德曼,我试过这样,在窗口加载的事件中一切都很好。`this.Loaded+=(s,e)=>{this.Dispatcher.BeginInvoke((操作)(()=>{Console.WriteLine(this.textBlock.ActualWidth);Console.WriteLine(“她”);};};`我已经尝试过这样一种方法——但我的问题是,在我需要它的时候,它永远不会被加载。在我的main中调用它并将实际宽度设置为一个变量之后,我继续使用这个变量(在我的main方法中)。它仍然会返回零,因为它仍然没有加载。它应该可以工作。请尝试父windows dispatcher,而不是控件的dispatcher。这将有助于它的外观。例如,此.dispatcher.BeginInvoke((操作)…嗨,德曼,我这样尝试过,在窗口加载的事件中,一切都很好。`this.loaded+=(s,e)=>{this.Dispatcher.BeginInvoke((操作)(()=>{Console.WriteLine(this.textBlock.ActualWidth);Console.WriteLine(“Her”);}`