我正在尝试创建一个包含网格的UserControl。网格内部是一个矩形,它覆盖除第一列和最后一列之外的所有列以及除第一行和最后一行之外的所有行。UserControl将改变形状以适合其父对象,并且从UserControl的边缘到矩形的距离应始终保持一致。
我第一次尝试时,我在ColumnDefinition和RowDefinition中使用了百分比,但只有当UserControl是正方形时,它才能正确工作。否则,矩形到UserControl边缘的距离在顶部/底部和两侧之间不一致。
第二次尝试时,我尝试将网格的最后一列、第一行和最后一行的宽度绑定到第一列的ActualWidth。这不起作用。所有边从矩形到UserControl边的距离都不相等。
第三次尝试时,我突然想到我需要获得UserControl的ActualHeight和ActualWidth的比率,然后用它来设置网格的第一列和最后一列以及网格的第一行和最后一行的宽度。我在Loaded事件中尝试了这个计算,但它不起作用,而且当调整UserControl的大小时它也不起作用。
我不知所措。有谁知道如何克服这个问题吗?
这是我正在努力实现的一张图片。

蓝色区域是用户控件。他们的香草区是里面的长方形。我手动设置列宽和行高,使其看起来像我想要的那样。
发布于 2020-09-18 22:34:12
这听起来像是你想要一个边框的控件,其尺寸是控件的宽/高或屏幕的某个比例。
下面是我快速模拟的一个简单的UserControl:
using System.Windows;
using System.Windows.Controls;
namespace WpfApp1
{
public sealed class ConsistentBorderControl : UserControl
{
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
base.OnRenderSizeChanged(sizeInfo);
double dimension = sizeInfo.NewSize.Width * 0.1;
Tag = new Thickness(dimension);
}
}
}它挂接到RenderSizeChanged事件中,并将边框的尺寸计算为控件当前宽度的10%。然后,它使用它来创建统一的Thickness,并将其放入Tag属性(您可能会更好地使用自定义依赖属性来保存该厚度值)。
然后,在UserControl中的XAML中,我们可以简单地创建一个Border元素,它的BorderThickness绑定到其父元素的Tag属性:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1">
<local:ConsistentBorderControl x:Name="parent">
<Border BorderBrush="Blue" BorderThickness="{Binding Tag, ElementName=parent}">
<Grid ... >
</Border>
</local:ConsistentBorderControl>
</Window>您还可以通过使用System.Windows.SystemParameters.WorkArea而不是控件的呈现大小,使边框尺寸基于屏幕的大小。(然而,这只适用于主屏幕,在WPF中访问多个显示器尺寸有点棘手)。
https://stackoverflow.com/questions/63913591
复制相似问题