在WPF中如何获取应用边距后控件的可见大小?

问题描述 投票:0回答:1

我有一个网格,其宽度设置为250。窗口的宽度为600。网格的左右边距设置为50和400。因此渲染的网格宽度减少为600-(50+400) = 150.

我想知道如何找到第一个网格的正确可见宽度(150)。但是,以下属性都没有返回 150。

g1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
Debug.WriteLine($"g1.DesiredSize.Width={g1.DesiredSize.Width}"); // Returns 700
Debug.WriteLine($"g1.ActualWidth={g1.ActualWidth}"); //Returns 250
Debug.WriteLine($"g1.RenderSize.Width={g1.RenderSize.Width}"); //Returns 250
Debug.WriteLine($"g1.Width={g1.Width}"); //Returns 250

Xaml代码是

<Window Title="MainWindow" Width="600" Height="300">
    <StackPanel>
        <Grid Name ="g1" Margin="50,0,400,0" Background="GreenYellow" Width="250" Height="50"/>
        <Grid Name ="g2" Margin="50,0,400,0" Background="LightBlue" Width="150" Height="50"/>
    </StackPanel>
</Window>

输出是:

wpf wpf-controls
1个回答
0
投票

好吧,我认为问题是因为

ClipToBounds
问题。因此,实际上网格被渲染为与定义的 250 相同的大小,但是,只有 150 宽度的一部分可见,其余网格被剪裁。更多解释可以在 stackoverflow

上找到

如果您不希望网格被剪裁以使整个 250 宽度的网格可见,那么有两种选择

  • 将 Grid 替换为

    Canvas
    控件,不受 影响
    ClipToBounds
    问题。

  • 创建一个自定义网格来覆盖

    GetLayoutClip()
    返回 当 ClipToBounds=false 时为 null

如果您在网格内放置边框,事情会变得更加清晰,然后您可以看到第一个网格实际上被剪裁而不是渲染为 150 的宽度。

这是输出:

这是MainWindow.xaml

<Window x:Class="ClipToBounds.ClipToBound_Demo_Problem_Using_Grid"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ClipToBounds"
        Title="MainWindow" Width="600" Height="300">
    <StackPanel>
        <Grid Margin="50,0,400,0" Background="GreenYellow" Width="250" Height="50">
            <Border BorderBrush="Blue" BorderThickness="2"></Border>
        </Grid>
        <local:MyGrid Margin="50,0,400,0" Background="GreenYellow" Width="250" Height="50">
            <Border BorderBrush="Blue" BorderThickness="2"></Border>
        </local:MyGrid>
        <Canvas  Margin="50,0,400,0" Background="GreenYellow" Width="250" Height="50">
            <Border BorderBrush="Blue" BorderThickness="2"  Width="250" Height="50"></Border>
        </Canvas>
        <Grid Margin="50,0,400,0" Background="LightBlue" Width="150" Height="50"/>
    </StackPanel>
</Window>

这是 CustomGrid MyGrid.cs 的代码

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace ClipToBounds;

public class MyGrid : Grid
{
    protected override Geometry GetLayoutClip(Size layoutSlotSize)
    {
        return ClipToBounds ? base.GetLayoutClip(layoutSlotSize) : null;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.