很抱歉问这个问题,因为我发现了很多类似的问题,但是对他们有用的解决方案似乎不适用于此......
我有许多自定义控件生成路径(有些是静态的,有些是绑定到更新的值)。
我在单个itemscontrol上显示这些内容(使用canvas作为itemspaneltemplate),我需要抓住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);
}));
我需要这样做的原因是控件中元素的宽度和高度实际上是动态的,我需要能够在相对于实际控件位置的适当点处注释图表。
非常感谢任何帮助!
干杯。
也许我需要更清楚地解释这个意图才有意义。我有一个可缩放的画布,其中显示了一组控件。每个控件都需要放在画布中,我需要知道画布上这些控件的高度和宽度。
在每个控件中都有一系列路径(根据示例代码),这些路径都相对于彼此定位,因此我在控件中嵌入了一个画布。控件还有标签,上下文菜单等。
如果还有另一种更干净的方法来解决这个问题,那么我全心全意:)
答案 0 :(得分: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。