Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 10
  • 65

Załóżmy, że mamy zdefiniowany UniformGrid, 9x9 elementów i każda z komórek siatki zawiera przycisk:

 

<UniformGrid Rows="9" Columns="9">
   <Button Click="btn_Click" />
   <Button Click="btn_Click" />
   <Button Click="btn_Click" />
   (...)
</UniformGrid>

 

Jak z poziomu obsługi zdarzeń mogę dostać pozycję przycisku w Gridzie tzn. jego kolumnę i wiersz?

Próbowałem czegoś takiego, ale zwraca zawsze 0,0 :

 

private void btn_Click(object sender, RoutedEventArgs e)
{
      var element = (UIElement)e.Source;
      int c = Grid.GetColumn(element);
      int r = Grid.GetRow(element);
}
 

 

Dzieje się tak dlatego, że nie ma uzupełnionych attached properties dla każdego z przycisków, czyli brakuje czegoś takiego:

 

<Button Click="btn_Click" Grid.Row="1" Grid.Column="1"/>

 

 

Czy pomimo braku attached properties, da się jakoś odczytać pozycję poszczególnych przycisków?

Maciej_Krauze
  • Zapytał
  • @ Maciej_Krauze | 05.02.2015
    • lider
    • laureat
    • 45
    • 16
    • 58
Zaloguj się aby zadać pytanie
Pokrewne

Odpowiedź (1)

  • 9

Problem wynika nie tyle z braku dołączonych właściwości, ile z pewnej niespójności w podanej definicji interfejsu użytkownika (XAML) oraz kodu. W XAMLu mamy użytą klasę UniformGrid, w obsłudze zdarzenia natomiast wywołanie metod GetColumn, GetRow następuje przy użyciu klasy Grid. Niestety klasa UniformGrid nie dziedziczy po klasie Grid, takie wywołanie nie może się powieść. Zakładając, że zależy nam na użyciu klasy UniformGrid, ze względu na wygodę automatycznego generowania wierszy i kolumn można użyć obejścia. Zakładając, że obiekty potomne są rozkładane w kolejności dodania, a kolekcja Children instancji tej klasy zwraca kolejne obiekty, położenie w kolumnach/wierszach można obliczyć na podstawie indeksu obiektu w kolekcji:

 

var element = (UIElement)e.Source;
int i = 1;
foreach (var item in ug.Children)
{
if (element.Equals(item))
{
    Debug.WriteLine("col:{0} row:{1}", 
        ((i % ug.Columns) == 0) ? ug.Columns : i % ug.Columns, 
        (i / ug.Rows) + 1);
}
i++;
}

 

Dla uproszczenia dla instancji UniformGrid została nadana nazwa ug:

 

<UniformGrid Rows="3" Columns="3" x:Name="ug">

 

Należy pamiętać, że w przypadku krytycznych aplikacji, należy poszukać bardziej stabilnej alternatywy podanego obejścia.

 

  • Odpowiedział
  • @ | 16.02.2015
  • TRENER ALTKOM AKADEMII
Komentarze
Panie Jacku, dziękuję za odpowiedź. Oczywiście założyłem że UniformGrid dziedziczy po Grid i stąd cały problem. Podany kawałek kodu na pewno mi się przyda.
Skomentował : @ Maciej_Krauze ,16.02.2015
  • 45
  • 16
  • 58