【问题标题】:ActualWidth / ActualHeight of custom control自定义控件的 ActualWidth / ActualHeight
【发布时间】:2016-06-09 07:49:44
【问题描述】:

很抱歉问这个问题,因为我发现了很多类似的问题,但不知何故,对他们有用的解决方案似乎不适用于这里......

我有许多生成路径的自定义控件(有些是静态的,有些绑定到更新的值)。

我在单个项目控件上显示这些(使用画布作为项目面板模板),我需要获取各个项目的 X 和 Y 位置。下面显示的项目之一的 XAML:

<Style TargetType="{x:Type pg:GraphVertexBelt}">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type pg:GraphVertexBelt}">
            <Border Background="Transparent">
                <StackPanel>
                    <Canvas Width="225" Height="20">
                        <Ellipse Height="10" Width="10" Canvas.Left="10"/>
                        <Ellipse Height="10" Width="10" Canvas.Left="220"/>
                        <Line X1="15" Y1="0.5" X2="225" Y2="0.5"/>
                    </Canvas>
                    <Label Content="{Binding Item.Tag.Title}" HorizontalAlignment="Center"/>
                </StackPanel>
            </Border>
        </ControlTemplate>
    </Setter>
</Setter>

我遇到的问题是 ActualHeight / ActualWidth 总是显示为零。

我试过了:

  • 为控件内的画布应用定义的恒定宽度和高度(这很不方便,因为它需要手动调整每个控件)
  • 渲染后使用委托来识别宽度:

            Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Render, new Action(() =>
        {
            Console.Write(Items[0].Item.ActualWidth);
        }));
    

我需要这样做的原因是控件中元素的宽度和高度实际上是动态的,并且我需要能够在相对于实际控件位置的适当点对图表进行注释。

任何帮助将不胜感激!

干杯。

编辑

也许我需要更清楚地解释一下意图,这样才有意义。我有一个可缩放的画布,其中显示了一组控件。每个控件都需要定位在画布内,我需要知道这些控件在画布上的高度和宽度。

每个控件中都有一系列路径(根据示例代码),这些路径都相对于彼此定位,因此我在控件中嵌入了一个画布。该控件还具有标签、上下文菜单等。

如果有另一种更干净的方法来解决这个问题,那么我会全神贯注:)

【问题讨论】:

  • 覆盖 Canvas 的 Measure and Arrange 怎么样?我认为,这是最直接的方法。
  • @tgpdyk - 你的意思是“GraphVertexBelt”的测量/排列吗?不确定画布包装器是否有帮助,因为它包含一组类似的控件。我会看看我是否可以为各个控件覆盖这些函数,看看它是什么样子的。
  • 我的意思是您的 ItemsPanelTemplate 是自定义画布。我会发布一个答案。

标签: c# wpf


【解决方案1】:

我建议创建自己的 Canvas 并覆盖 Measure and Arrange。

public class MyCanvas : Canvas
{
    protected override Size MeasureOverride(Size constraint)
    {
        Size desiredSize = new Size();
        foreach (UIElement child in this.Children)
        {
            // This is your "control" 
            child.Measure(constraint);
            // This is the size of the "control".
            var myControlSize = child.DesiredSize;
        }
        return desiredSize;
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        // When this is called, you should know the DesiredSize of each control
        // and you can decide where each control location relative to the canvas.
        return arrangeSize;
    }
}

然后使用 MyCanvas 作为您的 ItemsPanelTemplate。

WPF Layout

【讨论】:

  • 啊!我花了一段时间才弄清楚你在告诉我什么,但现在这很有意义。应该帮助我清理我也在做的一堆其他废话......谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多