2016-05-06 3 views
0

Bonjour Je suis en train d'apprendre le développement de Windows 8.1 avec Visual Studio 2015.
Comment puis-je faire référence à un élément XAML dans un fichier XAML de l'associé. fichier xaml.cs.

fichier MainPage.xaml:Reportez-vous à un élément XAML dans le fichier de xaml.cs dans le projet de 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> 
//... 

fichier MainPage.xaml.cs:

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

Sur mapButton je reçois l'erreur: le nom 'mapButton' n'existe pas dans le contexte actuel.
Je pensais que x:Name était un moyen de donner un nom avec lequel je peux accéder à l'élément xaml à partir du fichier .xaml.cs.

Répondre

1

Le problème ici est que vous essayez d'accéder au nom d'un bouton à partir d'un contenu généré. mapButton n'est pas dans la portée de Page mais dans le domaine de HubSection. Ce que vous devez vraiment faire, si vous voulez accéder à l'élément du bouton, c'est d'utiliser le VisualTreeHelper pour obtenir le bouton à l'exécution.

Voici un exemple.

fonction d'assistance:

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); 
    } 
} 

Accès au bouton:

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... 
} 

Bien que si vous vouliez vraiment tracer une commande à Click, vous devriez envisager de le faire dans le XAML par binding.

+0

C'est exactement la même chose, mais cela ne fonctionne pas. – aurelienC

+1

Espérons que la nouvelle réponse fonctionne pour vous. –

+0

OUI, OUI, OUI MISTER !!! Je veux dire, votre solution fonctionne bien, d'ailleurs il y a une faute de frappe dans la fonction sugnature: 'DependencyObject tartNode'. – aurelienC