2016-06-09 62 views
0

不好意思问这一个,因为我发现很多类似的问题,但不知何故已经为他们工作的解决方案似乎并不适用于此......ActualWidth的/的ActualHeight

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

我在单个itemcontrol上显示这些(使用画布作为itemspaneltemplate),并且我需要获取各个项目的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); 
        })); 
    

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

任何帮助将不胜感激!

干杯。

编辑

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

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

如果没有解决这个另一种更清洁的方式,然后我所有的耳朵:)

+1

覆盖帆布的“测量和排列”如何?我认为,这是最直接的方法。 – tgpdyk

+0

@tgpdyk - 你的意思是测量/安排“GraphVertexBelt”?不确定画布包装是否会有所帮助,因为它包含一组类似的控件。我将研究是否可以重写单个控件的这些函数,并查看它们的外观。 – Squanchy

+0

我的意思是你的ItemsPanelTemplate是一个自定义画布。我会发布一个答案。 – tgpdyk

回答

1

我建议创建自己的帆布和覆盖措施和安排。

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

+0

啊!花了我一段时间来弄清楚你告诉我的是什么,但是现在这变得非常有意义。应该帮助我清理一堆我正在做的其他废话......谢谢! – Squanchy

相关问题