WPF dostęp do grida poza funkcją

0

Witam.
W XAMLu mam w taki sposób zdefiniowaną pierwszą linijkę z moją siatką

<Grid x:Name="grid"  ........

następnie muszę z poziomu kodu dodawać przyciski, czyli programistycznie. W kodzie nie tworzę czegoś typu Grid grid = new Grid().
Po prostu dając w XAMLu to co wkleiłem powyżej mam dostęp do mojego grid.Pierwsza funkcja, której używam aby dodać przycisk do grida wygląda mniej więcej tak:

void set_checker()
{
  round_table[i, j] = warcab.create_warcab(i, j, 2); // tablica przechowuje przyciski, które się tworzą z pewnymi parametrami
  grid.Children.Add(round_table[i, j]);
}

I ta funkcja działa prawidłowo. Problem pojawia się dalej. Po wyjściu z tej funkcji, w późniejszym używaniu programu muszę znowu dodać przycisk do tablicy a potem do grida.

public void swap()
{
round_table[i_position, j_position] = warcab.create_warcab(i_position, j_position, p11);           
grid.Children.Add(round_table[i_position, j_position]);
}

Kompilacja przebiega bez problemu, ale w trakcie działania programu dostaje exception:

System.NullReferenceException: „Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.”
grid było null.

Wniosek taki, że grid po zakończeniu działania pierwszej funkcji nie jest globalny i usuwa się. Czy się mylę ? Jak to naprawić lub przekazać grida z jednej funkcji do drugiej ?

0

Czy funkcja set_checker() i swap() jest w tym samym pliku .cs co jest Grid?

0

Zdebuguj najlepiej i sprawdź co jest nullem zamiast zgadywać.

0

@Progress nie zgaduję. W pierwszej funkcji grid nie jest nullem. Po przejściu do drugiej w debuggerze widzę, żę już jest NULL.
@AdamWox funkcje są w tym samym pliku ale dzieje się coś jeszcze w innym pliku cs. Plik w któym jest definicja set_checker() wywołuje tą definicję. Potem dzieje się coś w innym pliku *.cs i ten inny plik wywołuje potem swap(). Najlepiej zobrazuje to kodem:

round.xaml.cs

 void set_checker()  // służy do ustawienia warcab na szachownicy
        {
           
            for(int i=0;i<=2;i++)//second player
            {
                for(int j=0;j<=7;j++)
                {
                    if (i == 1)
                    {
                        round_table[i, j] = warcab.create_warcab(i, j, 2);

                        grid.Children.Add(round_table[i, j]); // w tej funkcji bardzo ładnie działa
                        j++;
                    }
                    else
                    {                       
                            j++;
                        if (j == 8) { }
                        else
                        {
                            round_table[i, j] = warcab.create_warcab(i, j, 2);
                            grid.Children.Add(round_table[i, j]);
                            //round_table[i, j] = 2;
                        }           
                }
            }
                  ...... dalej jest uzupełnianie round_table o wielkości 8x8 ale nie ma sensu wklejać bo mechanizm jest podobny, nic nie wnosi do problemu
        }

public void swap() /*jej zadaniem jest zamiana na planszy z szachownicą elementów. Czyli ruszam się na pionkiem w puste pole, więc pionek idzie w miejsce pustego pola a puste pole staje się pionkiem (nie testowałem czy ten algorytm działa i czy logicznie jest poprawny bo właśnie mam exception :( ) */
        {
            Thickness tmp_margin1 = WARCAB.click_table[0].Margin;
            //Thickness tmp_margin2 = click_table[1].Margin;
            int i_position = int.Parse(WARCAB.click_table[0].Name.Substring(7, 1));
            int j_position = int.Parse(WARCAB.click_table[0].Name.Substring(8, 1));
            int i_position_target = int.Parse(WARCAB.click_table[1].Name.Substring(7, 1));
            int j_position_target = int.Parse(WARCAB.click_table[1].Name.Substring(8, 1));

            WARCAB.click_table[0].Margin = WARCAB.click_table[1].Margin;
            WARCAB.click_table[1].Margin = tmp_margin1;
            round_table[i_position, j_position] = WARCAB.click_table[1];
            round_table[i_position_target, j_position_target] = WARCAB.click_table[0];

            string p1 = (WARCAB.click_table[1].Content).ToString();
            int p11 = int.Parse(p1);
            
            round_table[i_position, j_position] = warcab.create_warcab(i_position, j_position, p11);
           
            grid.Children.Add(round_table[i_position, j_position]); // w tym miejsciu dostaje błąd, że grid jest  pusty

            string p2 = (WARCAB.click_table[0].Content).ToString();
            int p22 = int.Parse(p2);
            round_table[i_position_target, j_position_target] = warcab.create_warcab(i_position_target, i_position_target, p22);
            grid.Children.Add(round_table[i_position_target, j_position_target]);
        }




warcab.cs //tworzy mi jednego, konkretnego "warcaba", czyli pionek

public Thickness get_coordinate(int i,int j)
{
            Margin = new Thickness();

            if ((i == 0) && (j == 1))
            {
                Margin = new Thickness(68, 20, 315, 502);

            }
// i tak dalej, definiuje w tej funkcji współrzędne punktu do narysowania na planszy przycisku, nie ma sensu wklejać aż do    if ((i == 7) && (j == 7))
}

 public  Button create_warcab(int i,int j,int player)
{
            string p1_skin = "files/p1.png";
            string p2_skin = "files/p2.png";
            Thickness _margin = get_coordinate(i, j);
            Button button = new Button();
            
            if (player==2)
            {
                button.Margin = _margin;
                button.Content = player.ToString();
                button.Width = 34;
                button.Height = 34;
                button.Name = "button_" +i.ToString() + j.ToString();
                button.Background = new ImageBrush { ImageSource = new BitmapImage(new Uri(p2_skin, UriKind.Relative)) };
                button.BorderBrush = new SolidColorBrush(Colors.Transparent);
                button.AddHandler(Button.ClickEvent, new RoutedEventHandler(Nbutton_Click));              
               
            }
//player 2, czyli drugi gracz, który znajduje się na górze szachownicy, potem jeszcze jest definicja player 0 - czyli wolna przestrzeń między graczami, player 1 - analogicznie

  return button;
}

public void Nbutton_Click(object sender, EventArgs e) 
/*
logika tego jest taka: użytkownik klika swój pionek a potem znowu klika miejsce gdzie chce go przenieść. I obydwa przyciski (ten z pionkiem i ten z pustym miejscem) zapisywane są do click_table. Następnie wykonywana jest  swap(), czyli znowu powracamy do pliku round.xaml.cs
/*
        {
            click_counter++;
            if (click_counter == 1)
            {
                Button tmp_button1 = sender as Button;
                click_table[0] = tmp_button1;
            }
            else
            {
                Button tmp_button2 = sender as Button;
                click_table[1] = tmp_button2;
                click_counter = 0;
                ROUND round = new ROUND();
                round.swap();
            }
        }
0

Jeszcze ta funkcja by mnie interesowała WARCAB.click_table[0]. Rzuć kodem

0

Problem rozwiązany. Zamianę ze sobą przycisków dalem do public void Nbutton_Click(object sender, EventArgs e). Dzięki temu nie muszę jeszcze raz rysować na grdzie. Wystarczy zmienić współrzędne marginesu w tablicy z moim konkretnym przyciskiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1