2016-05-06 7 views
0

にxaml.csファイル内のXAML要素を参照してください私は現在、私は、関連からの.xamlファイル内のXAML要素を参照することができますどのようにVisual Studioに2015
をWindowsの8.1の開発を学んでいます。 xaml.csファイル

MainPage.xamlをファイル:こんにちはWindowsの8.1プロジェクト

<Page 
x:Class="project.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:project" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"> 

     <HubSection Width="600" x:Uid="Section1Header" Header="Map"> 
     <DataTemplate> 
      <Grid> 
       <Button x:Name="mapButton" Content="Find my location"/> 
      </Grid> 
     </DataTemplate> 
    </HubSection> 
//... 

MainPage.xaml.csファイルは:実際のコンテキストに存在しない名前 'mapButton':mapButtonオン

namespace project 
{ 
    public sealed partial class MainPage : Page 
    { 
     public MainPage() 
     { 
      this.InitializeComponent(); 
      mapButton.Click += mapButton_Click; 
     } 
} 

私はエラーを取得します。
x:Nameは.xaml.csファイルからxaml要素にアクセスできる名前を与える方法だと思いました。

答えて

1

ここでの問題は、生成されたコンテンツからボタンの名前にアクセスしようとしていることです。 mapButtonは、Pageの範囲ではなく、HubSectionの範囲に含まれます。あなたが本当にしなければならないことは、ボタン要素にアクセスする場合は、VisualTreeHelperを使用して実行時にボタンを取得することです。

ここは例です。

ヘルパー機能:ボタンへのアクセス

internal static void FindChildren<T>(List<T> results, DependencyObject startNode) where T : DependencyObject 
{ 
    int count = VisualTreeHelper.GetChildrenCount(startNode); 
    for (int i = 0; i < count; i++) 
    { 
     DependencyObject current = VisualTreeHelper.GetChild(startNode, i); 
     if ((current.GetType()).Equals(typeof(T)) || (current.GetType().GetTypeInfo().IsSubclassOf(typeof(T)))) 
     { 
      T asType = (T)current; 
      results.Add(asType); 
     } 
     FindChildren<T>(results, current); 
    } 
} 

public MainPage() 
{ 
    this.InitializeComponent(); 
    Loaded += (sender, e) => 
    { 
     List<Button> results = new List<Button>(); 
     FindChildren(results, Hub); 
     var mapButton = results.Find(item => item.Name.Equals("mapButton")); 
     mapButton.Click += mapButton_Click; 
    }; 
} 

private void mapButton_Click(object sender, RoutedEventArgs arg) 
{ 
    // Do something... 
} 

あなたが本当にClickにコマンドをマッピングしたい場合、あなたはbindingを通じてXAMLでそれを行うことを検討すべきであるが。

+0

これはまったく同じですが、動作しません。 – aurelienC

+1

うまくいけば新しい答えがあなたのために働くことを望みます。 –

+0

YES、YES、YES MISTER !!!つまり、あなたのソリューションはうまくいきます。つまり、関数sugnatureにタイプミスがあります: 'DependencyObject tartNode'です。 – aurelienC

関連する問題