我有一个网格,其宽度设置为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>
输出是:
好吧,我认为问题是因为
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;
}
}