2015-07-02 38 views
0

我在ResourceDictionary中定義的控件模板:如何從代碼訪問資源的結構(在可視化樹中)?

<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的一些參考點,使用該控件模板編程也可讀取的位置。

具體而言,我想獲得imagem.Widthimagem.Heightfrontal.Canvas.Leftfrontal.Canvas.Topfrontal.Angleline.Margin.Left,這樣我可以編程方式生成可點擊的形狀上的用戶控件採取圖像simmetry的優點的陣列。

回答

1
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; 
    } 
+0

工作很好!值得一提的是,在我的例子中,'controlTemplateContent'是一個Grid,所以另一種可能的方法是將其轉換爲Grid並通過'Children'屬性訪問它們的元素。 – heltonbiker

0

的做到這一點,當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; 
+0

這個例子解決你的問題嗎? –

+0

其實不是,因爲後面的代碼運行在其他UserControl中,我想從中讀取ControlTemplate的內容(順便說一下是另一種類型)。閱讀我的問題中的「上下文」部分。 – heltonbiker

相關問題