2014-10-08 7 views
2

У меня есть следующий XAML-код, который используется на применении хаб для окон 8.1:Получить элементы управления внутри управления DataTemplate

<HubSection Width="780" Margin="0,0,80,0"> 
       <HubSection.Background> 
        <ImageBrush ImageSource="Assets/MediumGray.png" Stretch="UniformToFill" /> 
       </HubSection.Background> 
       <DataTemplate> 
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> 
         <m:Map Credentials="YOUR_BING_MAPS_KEY"> 
          <m:Map.Children> 
           <!-- Data Layer--> 
           <m:MapLayer Name="DataLayer"/> 

           <!--Common Infobox--> 
           <m:MapLayer> 
            <Grid x:Name="Infobox" Visibility="Collapsed" Margin="0,-115,-15,0"> 
             <Border Width="300" Height="110" Background="Black" Opacity="0.8" BorderBrush="White" BorderThickness="2" CornerRadius="5"/> 

            </Grid> 
           </m:MapLayer> 
          </m:Map.Children> 
         </m:Map> 
        </Grid> 

       </DataTemplate> 
      </HubSection> 

Проблема заключается в том, что я не могу получить доступ к MapLayer и к Grid управления в C# стр. (Проблема возникает только в том случае, если XAML находится внутри элемента управления DataTepmlate). Как я могу получить этот доступ?

+0

Добавить имя для сетки и использовать метод Control.Findname, чтобы получить ваш ребенок контролирует – Sajeetharan

+0

@Sajeetharan Спасибо за ваш комментарий, но вы можете мольбу опубликовать пример того, как код должен выглядеть? (Когда я добавил свойство name, я получил сообщение об ошибке: «Имя свойства задано более одного раза» « –

+0

Проверьте эту ссылку http://stackoverflow.com/questions/5181063/how-to-access-a-specific-item -in-a-listbox-with-datatemplate – Sajeetharan

ответ

2

Вы должны использовать метод VisualTreeHelper. Это всего лишь код, который я использую. Я думаю, вы можете легко настроить его на свои нужды.

Сначала поставить метод FindElementByName где-то в код позади файла:

public T FindElementByName<T>(DependencyObject element, string sChildName) where T : FrameworkElement 
    { 
     T childElement = null; 
     var nChildCount = VisualTreeHelper.GetChildrenCount(element); 
     for (int i = 0; i < nChildCount; i++) 
     { 
      FrameworkElement child = VisualTreeHelper.GetChild(element, i) as FrameworkElement; 

      if (child == null) 
       continue; 

      if (child is T && child.Name.Equals(sChildName)) 
      { 
       childElement = (T)child; 
       break; 
      } 

      childElement = FindElementByName<T>(child, sChildName); 

      if (childElement != null) 
       break; 
     } 
     return childElement; 
    } 

Теперь вы можете начать использовать этот метод. Добавление обработчика событий к вашему MapLayer или на карте, как это:

<m:MapLayer Name="DataLayer" Loaded="DataLayerLoaded" /> 

Внутри обработчика теперь вы можете получить доступ к элементу с кодом, как это (вы, возможно, придется изменить это, как я не слишком хорошо знакомы с Hubsection контроль):

this.UpdateLayout(); 
// Give your hub a name using x:Name= 
var item = [..] // Retrieve your hubsection here! 
var container = this.MyHubSection.ContainerFromItem(item); 
// NPE safety, deny first 
if (container == null) 
    return; 
var datalayer = FindElementByName<MapLayer>(container, "DataLayer"); 
// And again deny if we got null 
if (datalayer == null) 
    return; 
/* 
    Start doing your stuff here. 
*/ 
Смежные вопросы