当UWP中的图像高度发生变化时,为什么应用程序会崩溃?

当UWP中的图像高度发生变化时,为什么应用程序会崩溃?,uwp,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/expr

以下是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>
嗯,当我运行应用程序,随意调整窗口大小时,应用程序崩溃了。奇怪的是,visual studio没有报告错误,只是突出显示了以下代码: 这些代码不是我默认在
App.g.i.cs


这有什么问题?我该如何解决这个问题?谢谢。

我猜在最初加载图像时会调用回调方法。然后设置图像高度,该高度再次调用回调方法(处理程序),该方法再次调用,因为您刚刚更改了高度…可能是stackoverflow。

错误为

检测到布局周期。布局无法完成

这对于指出问题的根本原因并不十分有用。然而,它确实表示某种循环(即无休止地调用函数)

在将调试日志添加到
BG_sizechange
方法之后,我注意到有很多!在应用程序崩溃之前点击,这意味着重复调用
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>  

关键是

  • 将一个显式的
    高度设置为
    堆栈面板
    、400或500,该值实际上并不重要,它只是设置了一个上限,用于调整所有图像的大小
  • 将每个图像的
    Stretch
    属性设置为
    Fill
    ,以便它们能够占据所有可用高度
  • 最后,神奇的
    ViewBox
    容器有助于在调整窗口大小时调整整个
    StackPanel
    的大小,同时保持
    StackPanel
    的高宽比。这就是为什么
    StackPanel
    高度不重要的原因

  • @kennyzx抱歉,我不知道您的实际意思,您的意思是我应该在Loaded event hanlder中绑定acutalheight,而不是在XAML中?我删除了我的评论,因为我意识到我没有仔细阅读。通过调整L和R的大小,BG的大小也会受到影响,从而触发更多BG_SizeChanged事件。最简单的解决方案可能是使用图像的Stretch属性。有四个可能的值,如果它们能发挥神奇的作用,请尝试它们。@kennyzx但是我的代码有什么问题吗?代码似乎并不复杂,但我不知道问题所在。@kennyzx或者是否有任何方法可以在不绑定或大小更改的情况下使图像高度相同?我想没有,应用程序崩溃似乎没有规则。有时我无限期地调整大小1秒,然后它崩溃,有时我无限期地调整大小5秒,然后它崩溃。哦,我现在知道你的意思了。它陷入了一个无休止的循环,所以它崩溃了。谢谢你,你的想法是使用viewbox很好!
    <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>