2010-02-18 8 views
2

J'ai un 10x10 Grid. Et dans chaque espace, j'ai ajouté une étiquette à laquelle j'ai ajouté un gestionnaire d'événement mousedoubleclick. Donc, quand je double-clique sur l'étiquette, il est censé montrer le numéro et Column, mais je n'ai que 0 pour les deux propriétés.Grid.GetRow et Grid.GetColumn renvoient 0

Ce code ... (et oui j'ai mis Grid.SetRow et Grid.SetColumn pour chaque étiquette)

private void grid_Checked(object sender, MouseButtonEventArgs e) 
{ 
    MessageBox.Show(Grid.GetRow(e.Source as UIElement).ToString()); 
} 
+0

J'ai rencontré ce problème lors de l'ajout de contrôles par programmation à partir d'une classe C# non statique. –

Répondre

3

Etes-vous sûr que tout est correctement branché? Les travaux suivants pour moi:

XAML:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    <Label Grid.Row="0" Grid.Column="0" MouseDown="Label_MouseDown"> 
     Label 0, 0 
    </Label> 
    <Label Grid.Row="0" Grid.Column="1" MouseDown="Label_MouseDown"> 
     Label 0, 1 
    </Label> 
    <Label Grid.Row="0" Grid.Column="2" MouseDown="Label_MouseDown"> 
     Label 0, 2 
    </Label> 
    <Label Grid.Row="1" Grid.Column="0" MouseDown="Label_MouseDown"> 
     Label 1, 0 
    </Label> 
    <Label Grid.Row="1" Grid.Column="1" MouseDown="Label_MouseDown"> 
     Label 1, 1 
    </Label> 
    <Label Grid.Row="1" Grid.Column="2" MouseDown="Label_MouseDown"> 
     Label 1, 2 
    </Label> 
    <Label Grid.Row="2" Grid.Column="0" MouseDown="Label_MouseDown"> 
     Label 2, 0 
    </Label> 
    <Label Grid.Row="2" Grid.Column="1" MouseDown="Label_MouseDown"> 
     Label 2, 1 
    </Label> 
    <Label Grid.Row="2" Grid.Column="2" MouseDown="Label_MouseDown"> 
     Label 2, 2 
    </Label> 
</Grid> 

C#:

private void Label_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var label = e.Source as UIElement; 
    var row = Grid.GetRow(label); 
    var col = Grid.GetColumn(label); 

    MessageBox.Show(string.Format("{0},{1}", row, col)); 
} 

Le MessageBox contient la ligne correcte et de la colonne lorsque je clique sur l'une des étiquettes.

1

Vous devrez peut-être utiliser e.OriginalSource au lieu de e.Source. L'événement checked, en tant qu'événement routé, changera e.Source lors de son acheminement dans l'arborescence.

+0

C'est pareil. Même si c'est un routedEvent je l'attrape sur l'étiquette. Je sais que le nom de la méthode n'est pas très bien choisi. C'est en fait comme ça. lbl.MouseDoubleClick + = new MouseButtonEventHandler (grid_Checked); Lbl étant l'étiquette. – Bogdan