Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.net 确保控件具有WPF中的大小:奇怪的问题_.net_Wpf - Fatal编程技术网

.net 确保控件具有WPF中的大小:奇怪的问题

.net 确保控件具有WPF中的大小:奇怪的问题,.net,wpf,.net,Wpf,我在WPF画布上遇到了一些奇怪的问题,我无法解决,希望你们中的一些大师能够:) 情况是这样的:在我的应用程序中,当用户单击列表中的项目时,我会创建一个新画布,用元素填充它,并将其作为选项卡添加到tabcontrol中 这里出现了问题:我想以某种方式在画布上排列项目,但要做到这一点,我需要知道画布的大小。因为我刚刚创建了画布并将其放置到位,所以它还没有大小。所以我要做的就是对它调用“UpdateLayout()” 这给了它正确的大小,但当事情开始出错时:只要我调用UpdateLayout(),应用

我在WPF画布上遇到了一些奇怪的问题,我无法解决,希望你们中的一些大师能够:)

情况是这样的:在我的应用程序中,当用户单击列表中的项目时,我会创建一个新画布,用元素填充它,并将其作为选项卡添加到tabcontrol中

这里出现了问题:我想以某种方式在画布上排列项目,但要做到这一点,我需要知道画布的大小。因为我刚刚创建了画布并将其放置到位,所以它还没有大小。所以我要做的就是对它调用“UpdateLayout()”

这给了它正确的大小,但当事情开始出错时:只要我调用UpdateLayout(),应用程序CPU的使用率就会猛增到100%(但UI仍然保持响应,并且不是我的任何代码造成的),画布内的所有控件都停止响应事件

你知道会发生什么吗


编辑:进一步检查后,我发现问题不是“UpdateLayout()”本身造成的,它实际上发生在我调用ActualWidth或ActualHeight时,而不是调用UpdateLayout,将您的排列代码包装在一个
调度程序中。BeginInvoke
,因此,它将在短时间后进行评估。

不要调用UpdateLayout,而是将排列代码包装在
Dispatcher.BeginInvoke
中,以便在短时间后对其进行评估。

您可以使用调试器中断进程并转储堆栈跟踪吗?它可能是一个无限循环,例如由于大小计算中的重复。我将使用事件画布。加载并将带有子控件初始化的代码放在那里(到事件处理程序)。因为除非控件可见,否则无法接收其大小。请注意,如果初始化为折叠,画布可能仍会接收已加载的事件,但尚未确定其大小。在本例中,您可以等待LayoutUpdated事件。我进一步调查发现,实际上并不是调用UpdateLayout导致问题,而是在调用UpdateLayout后在画布上调用“ActualWidth”或“ActualHeight”导致问题@Simon Mourier:我必须承认我不是在.NET中调试的专家,我该如何转储堆栈跟踪并检查它?你能使用调试器中断进程并转储堆栈跟踪吗?它可能是一个无限循环,例如由于大小计算中的重复。我将使用事件画布。加载并将带有子控件初始化的代码放在那里(到事件处理程序)。因为除非控件可见,否则无法接收其大小。请注意,如果初始化为折叠,画布可能仍会接收已加载的事件,但尚未确定其大小。在本例中,您可以等待LayoutUpdated事件。我进一步调查发现,实际上并不是调用UpdateLayout导致问题,而是在调用UpdateLayout后在画布上调用“ActualWidth”或“ActualHeight”导致问题@Simon Mourier:我必须承认我不是在.NET中调试的专家,我如何转储堆栈跟踪并检查它?