这是XAML:
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="Black">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image Source="Image/L.png" Name="L"></Image>
<Image Source="Image/BG.png" Grid.Column="1" Name="BG" SizeChanged="BG_SizeChanged"></Image>
<Image Source="Image/R.png" Grid.Column="2" Name="R"></Image>
</Grid>
</Page>
我想L和R的高度与BG相同。在WPF中,我可以绑定ActualHeight轻松完成它,但是在UWP中它失败了。我在stackoverflow中读了一些主题,知道我不能那样做还有。
所以我用SizeChanged
来做,代码如下:
private void BG_SizeChanged(object sender, SizeChangedEventArgs e)
{
L.Height = e.NewSize.Height;
R.Height = e.NewSize.Height;
}
嗯,当我运行APP并随意调整窗口大小时,APP崩溃了。奇怪的是,visual studio没有报告任何错误,只是突出显示了以下代码:
这些代码不是我默认在App.g.i.cs
这是怎么了?我该如何解决这个问题?谢谢
答案 0 :(得分:1)
错误是
检测到布局周期。布局无法完成。
指出问题的根本原因不是很有用。但是,它确实指示某种cycle
(即函数被无休止地调用)。
将调试日志添加到BG_SizeChanged
方法后,我注意到有很多!在应用崩溃之前命中,这意味着BG_SizeChanged
被重复调用,直到调用堆栈已满。保罗是对的。
调用堆栈为
调整BG的大小->调用BG_SizeChanged->在BG_SizeChanged方法中调整L / R的大小->调整BG的大小(因为列宽度定义为*,因为它占用了剩余的空间)= >>>>因此进入无限循环,直到应用崩溃。
解决方案
最困难的是三个图像的原始尺寸在布局中起着重要作用,它们的高宽比也可能不同。到目前为止,我找到了最佳解决方案,而不必为它们中的每一个计算“正确的”绝对大小是
<Viewbox HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<StackPanel Orientation="Horizontal" Height="400">
<Image Source="Image/L.png"
Name="L" Stretch="Fill" />
<Image Source="Image/BG.png"
Grid.Column="1"
Name="BG" Stretch="Fill" />
<Image Source="Image/R.png"
Grid.Column="2" Name="R" Stretch="Fill" />
</StackPanel>
</Viewbox>
键是
Height
设置为StackPanel
,400或500,该值并不重要,它只是设置了可以调整所有图像的高度的上限。Stretch
属性设置为Fill
,以便它们逐渐占据所有可用高度。ViewBox
容器,它在调整窗口大小时有助于调整整个StackPanel
的大小,同时保持StackPanel
的高宽比。这就是Height
的{{1}}无关紧要的原因。答案 1 :(得分:0)
我猜测最初加载图像时会调用回调方法。然后,您设置图像高度,然后再次调用回调方法(处理程序),由于您刚刚更改了高度,因此再次调用了该方法... stackoverflow。