如何从代码中访问资源的结构(在可视化树下)



我在ResourceDictionary中定义了一个ControlTemplate:

<ControlTemplate x:Key="FacePositionSource">    
    <Grid>
        <Image x:Name="imagem" Width="1028" Height="524" Source="/Miotec.AtlasControl;component/Image/face.png"/>
        <Canvas>
            <local:MusclePositionControl x:Name="frontal" Angle="22" Canvas.Left="571.5" Canvas.Top="108"/>
        </Canvas>
        <Line x:Name="line" X1="0" X2="0" Y1="0" Y2="{Binding Height, ElementName=imagem}"  Margin="514,0,0,0"/>
    </Grid>
</ControlTemplate>

在代码背后,我有:

    void AtlasFace_Loaded(object sender, RoutedEventArgs e)
    {
        var r = Application.Current.FindResource("FacePositionSource") as ControlTemplate;
        Console.WriteLine(r);
        // how to get those properties from "r"?
    }

当我在"r"处放置断点时,它实际上指的是控件,但看起来我不能"从其内部读取"?我应该公开这些元素吗?我应该用一些特殊的方法吗?


一些上下文:

创建它是为了让我可以直观地定位CustomControl的一些参考点,使用此ControlTemplate以编程方式读取位置。

具体来说,我想获得imagem.Widthimagem.Heightfrontal.Canvas.Leftfrontal.Canvas.Topfrontal.Angleline.Margin.Left,这样我就可以利用图像模拟在UserControl上以编程方式生成可点击形状的阵列。

var controlTemplate= Application.Current.FindResource("FacePositionSource") as ControlTemplate;
var controlTemplateContent = controlTemplate.LoadContent();
var img = GetChildOfType<Image>(controlTemplateContent);

以及用于接收子元素的代码

 public static T GetChildOfType<T>(DependencyObject depObj)
where T : DependencyObject
    {
        if (depObj == null) return null;
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            var child = VisualTreeHelper.GetChild(depObj, i);
            var result = (child as T) ?? GetChildOfType<T>(child);
            if (result != null) return result;
        }
        return null;
    }

当想要查找的element具有name时,这样做的最佳形式是:

CodeBehind中,例如找到Image控件:

    // mycontrol is the control which use the ControlTemplate
    mycontrol.ApplyTemplate();
    // here you have your image
    var innerImage= mycontrol.Template.Findname("imagem", mycontrol) as Image;

最新更新