当UWP中的图像高度更改时,为什么应用程序崩溃?

时间:2018-07-27 01:04:38

标签: uwp

这是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没有报告任何错误,只是突出显示了以下代码: enter image description here 这些代码不是我默认在App.g.i.cs

中编写的

这是怎么了?我该如何解决这个问题?谢谢

2 个答案:

答案 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>  

键是

  1. 将显式Height设置为StackPanel,400或500,该值并不重要,它只是设置了可以调整所有图像的高度的上限。
  2. 将每个图片的Stretch属性设置为Fill,以便它们逐渐占据所有可用高度。
  3. 最后,神奇的ViewBox容器,它在调整窗口大小时有助于调整整个StackPanel的大小,同时保持StackPanel的高宽比。这就是Height的{​​{1}}无关紧要的原因。

答案 1 :(得分:0)

我猜测最初加载图像时会调用回调方法。然后,您设置图像高度,然后再次调用回调方法(处理程序),由于您刚刚更改了高度,因此再次调用了该方法... stackoverflow。