【问题标题】:Why is the circle getting cut off?为什么圆圈会被切断?
【发布时间】:2017-05-02 19:50:04
【问题描述】:

步骤:

  1. 制作全新的“空白应用(通用 Windows)”
  2. 设置目标和最低版本:“Windows 10 Creators Update (10.0; Build 15063)”
  3. 将以下代码添加到 MainPage.xaml 并运行应用程序。

MainPage.xaml

<Grid Width="128" Height="120">
    <Grid.RowDefinitions>
        <RowDefinition Height="120" />
        <RowDefinition Height="1" x:Name="ChangeHeightRow" />
    </Grid.RowDefinitions>
    <Grid>
        <Canvas Background="Red">
            <Ellipse Width="140" Height="140" Fill="Green" />
        </Canvas>
    </Grid>
</Grid>

应该看到这个:

为什么绿色圆圈会被切断?此外,如果将ChangeHeightRow.Height 设置为0,它看起来像这样:

发生了什么事?我希望这个圈子永远被切断......也许我错了?

【问题讨论】:

  • 因为您的网格宽度为 128,高度为 120,但您的椭圆宽度为 140,高度为 140
  • @AVKNaidu,那么为什么在第二种情况下它停止被切断?
  • 还是一样。你的圈子比网格大。当没有第二行时,您基本上是在网格上堆叠圆圈。这就是为什么。

标签: xaml uwp win-universal-app uwp-xaml


【解决方案1】:

TL;DR:通过在 Grid 中有一个 1 像素的空行,您正在剪切 Ellipse

问题存在于多个层面。你的外部Grid 有一个WidthHeight 集。接下来你的RowDefinition 有一个Height 集,你的Ellipse 的大小比两个高度都大。

<Grid Width="128" Height="120">
    <Grid.RowDefinitions>
        <RowDefinition Height="120" />
        <RowDefinition Height="1" x:Name="ChangeHeightRow" />
    </Grid.RowDefinitions>
    <Grid>
        <Canvas Background="Red">
            <Ellipse Width="140" Height="140" Fill="Green" />
        </Canvas>
    </Grid>
</Grid>

通过设置这些大小,您可以让其他控件更接近内部控件,而不是使用 Auto 作为行的大小,而没有使用 (=auto) 作为 Grid 的大小。

在您的初始代码中,您有一个带有EllipseGrid 行和一个1 像素高的空行。默认情况下,XAML 控件具有 Z 轴,其中在 XAML 文件底部声明的项目是可视层中最顶层的控件。因此,对于您的网格,如果重叠,您的第二行位于第一行的顶部。由于Ellipse 泄漏到行外,因此将第二行绘制在其上并剪裁您的Ellipse

通过将高度设置为 0,第二行不再绘制,也无法剪辑您的控件。


为了更清楚地说明这一点,我稍微调整了您的 XAML,在您的网格之外添加了另一个 StackPanel 并添加了一个 Button。如您所见,Button 绘制在Ellipse 之上,正如它在下面的 XAML 中定义的那样,因此在 Z 轴上获得了更高的可视层。

<StackPanel Width="130">
    <Grid Width="128" Height="120">
        <Grid.RowDefinitions>
            <RowDefinition Height="120" />
            <RowDefinition Height="0" x:Name="ChangeHeightRow" />
        </Grid.RowDefinitions>
        <Grid>
            <Canvas Background="Red">
                <Ellipse Width="140" Height="140" Fill="Green" />
            </Canvas>
        </Grid>
    </Grid>
    <Button Background="Black" Foreground="White">Test</Button>
</StackPanel>

如果我们将 StackPanel 更改为 Grid,我们将有相同的行为。然而,在 XAML 声明中将 Button 移动到顶部(并将 Grid.Row 保持为 1,使其位于 Ellipse 下方),您会注意到它现在位于 Ellipse 之后,因为 Z 层的顺序不同。

<Grid Width="130">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Button Background="Black" Foreground="White" Grid.Row="1">Test</Button>
    <Grid Width="128" Height="120" Grid.Row="0">
        <Grid.RowDefinitions>
            <RowDefinition Height="120" />
            <RowDefinition Height="0" x:Name="ChangeHeightRow" />
        </Grid.RowDefinitions>
        <Grid>
            <Canvas Background="Red">
                <Ellipse Width="140" Height="140" Fill="Green" />
            </Canvas>
        </Grid>
    </Grid>
</Grid>

【讨论】:

  • "第二行被绘制在它上面并剪辑你的椭圆。"为什么画在它上面的第二行会导致剪辑呢?这对我来说没有意义。
  • “这就是 XAML 的工作方式”。您已经通过组合 Grid-Canvas-Ellipse 来欺骗大小。取出画布,它总是会被剪掉。第一行的 Z-index 为例如0,第二行 z-index 为 1(跨越整个宽度),基本上说“第 0 层,你完成了,轮到我了”。
  • 这是我的问题的一个更复杂的版本,它表明总是绘制第二行,并且似乎揭穿了它是 z-index 问题的理论。 gist.github.com/trevordunn/b415d420e7378858c0329d62476ef8af 似乎与高度相关(这对我来说仍然没有意义),而不是它们的顺序或它们是否被渲染。
猜你喜欢
  • 2021-04-18
  • 2020-03-15
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多