2015-07-02 5 views
0

У меня есть ControlTemplate, определенный в 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"? 
    } 

Когда я поставил точку останова «г», он на самом деле относится к контролю, но похоже, я не могу «читать из своих недр»? Должен ли я публиковать эти элементы? Должен ли я использовать какой-то специальный метод?


Некоторый контекст:

Это был создан, чтобы я мог визуально расположить несколько опорных точек в CustomControl, используя эту ControlTemplate для чтения позиции программно.

В частности, я хочу, чтобы получить imagem.Width, imagem.Height, frontal.Canvas.Left, frontal.Canvas.Top, frontal.Angle и line.Margin.Left, так что я могу программно генерировать массив интерактивных форм на UserControl воспользовавшись симметрии изображения.

ответ

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 и получить доступ к своим элементам через свойство' 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

 Смежные вопросы

  • Нет связанных вопросов^_^