gpt4 book ai didi

c# - 如何覆盖 MeasureOverride 以查找 ItemsControl 的大小

转载 作者:太空狗 更新时间:2023-10-29 23:53:33 24 4
gpt4 key购买 nike

我正在开发一个 UserControl,它由一个带有标题和项目列表的 block 组成(如 ItemsControl)。用户控件动态添加到 Canvas 。我需要在呈现之前获取控件的实际大小(包括 ItemsControl 占用的空间)。我尝试重写 UserControl 的 MeasureOverride 方法,希望大小会反射(reflect)在 DesiredSize 属性中。但它不起作用。

XAML 是:

<UserControl x:Class="MyTools.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid x:Name="LayoutRoot" Background="White">
<Border Name="MainBorder" CornerRadius="5" BorderThickness="2" BorderBrush="Black">
<Grid Name="grid1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
<Grid.RowDefinitions>
<RowDefinition Height="34" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Name="titleGrid" Grid.Row="0" Background="#FF727272">
<TextBlock Name="titleText" HorizontalAlignment="Center" Text="{Binding ControlName}" VerticalAlignment="Center" FontSize="13" FontWeight="Bold" Foreground="Beige" />
</Grid>
<Grid Name="gridpr" Grid.Row="1" Background="#12C48F35">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border Name="borderPr" CornerRadius="3" Margin="10" BorderThickness="1" BorderBrush="LightGray" Grid.Row="0">
<Grid Name="gridPr" Background="#FFC1C1C1" MouseLeftButtonUp="gridPr_MouseLeftButtonUp">
<StackPanel>
<TextBlock HorizontalAlignment="Center" Name="txtPr" Text="SubItems" VerticalAlignment="Center" Foreground="#FF584848" FontSize="12" />
<ItemsControl x:Name="pitems" ItemsSource="{Binding MyItems}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="15,0,0,0">
<TextBlock Text="{Binding MyVal}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
</Border>
</Grid>
</Grid>
</Border>
</Grid>
</UserControl>

我正在覆盖 UserControl 的 MeasureOverride,如下所示:

 namespace MyTools
{
public partial class MyControl : UserControl
{
public MyControl()
{
InitializeComponent();
}

public string ControlName { get; set; }
public object MyItems { get; set; }

public class Row
{
public string MyVal { get; set; }
}

protected override Size MeasureOverride(Size availableSize)
{
var desiredSize = base.MeasureOverride(availableSize);
var sideLength = Math.Min(desiredSize.Width, desiredSize.Height);

desiredSize.Width = sideLength;
desiredSize.Height = sideLength;

return desiredSize;
}
}
}

客户端代码:

       MyControl control1 = new MyControl();          
control1.ControlName = "Test Name";

var test = new List<MyControl.Row>(
new MyControl.Row[]
{
new MyControl.Row {MyVal = "Item1"},
new MyControl.Row {MyVal = "Item2"},
new MyControl.Row {MyVal = "Item3"}
});

control1.MyItems = test;

control1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
MessageBox.Show(control1.DesiredSize.Height.ToString());
canvas1.Children.Add(control1);

我没有使用客户端的 DesiredSize.Height 属性获取实际大小。知道如何解决这个问题吗?

最佳答案

您的用户控件是否定义为改变高度以反射(reflect)内容的大小?默认情况下,您的用户控件将具有固定大小,不会因为项目控件具有更多条目而改变高度。

我认为您需要在测量网格之前将您的用户控件添加到网格中。这就是我测量控件的方式,它似乎运行良好,即使直接测量控件在您的情况下不起作用......

MyControl control1 = new MyControl();

... your setup code for control1...

Dim containerGrid As New Grid
containerGrid.Children.Add(control1)
containerGrid.Measure(New Size(Double.MaxValue, Double.MaxValue))
containerGrid.Arrange(New Rect(0, 0, Double.MaxValue, Double.MaxValue))

...now check the grid.ActualWidth and grid.ActualHeight

关于c# - 如何覆盖 MeasureOverride 以查找 ItemsControl 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8844994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com