2014-10-08 37 views
2

我有上集線器應用程序用於窗戶8.1以下XAML代碼:獲取的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 2014-10-08 13:47:37

+0

@Sajeetharan謝謝,但你能認罪張貼代碼應該怎麼看起來像一個例子嗎? (當我添加名稱屬性我得到一個錯誤:「屬性名稱設置不止一次)」 – 2014-10-08 13:57:28

+0

檢查此鏈接http://stackoverflow.com/questions/5181063/how-to-access-a-specific-item在列表框與數據模板 – Sajeetharan 2014-10-08 13:59:00

回答

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. 
*/ 
相關問題