Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: WPF Grid - proměnný počet řádků

Aktivity
Avatar
Hit
Člen
Avatar
Hit:7.10.2015 15:44

Zdravím, mám aplikaci, která vygeneruje náhodné bludiště, a vypíše ho do konzole. Při pokusu o grafické zobrazení ve WPF jsem ovšem narazil na problém a hledám nějakého dobrodince, který by mi poradil.

Jedná se o to, že mám proměnnou velikost dvourozměrného pole, kterou si může uživatel zvolit. Toto pole jsem chtěl vykreslit do Gridu, problém je v tom, že nevím, jak na základě proměnné, která obsahuje rozměr pole (např. 11) dynamicky vytvořit tomuto číslu odpovídající počet řádků a sloupců Grid layoutu. Dá se tohle ošetřit nějakým způsobem přímo v XAMLu nebo je potřeba vytvořit si v kódu vlastní layout? Předem díky za odpovědi.

Odpovědět
7.10.2015 15:44
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Hit
ostrozan:7.10.2015 21:46

Pole čeho? - brambor, kukuřice, stringů, čísel, buttonů?
A proč do Gridu? Grid je kontejner na kontrolky - takže pro ty buttony snad, ale jinak jsou pro to určené jiné elementy - třeba DataGrid (pokud jsi neměl na mysli spíš toto),nebo tabulka

nicméně
vytvoření mřížky podle rozměrů dvojrozměrného pole by mohlo vypadat asi takto

void vytvor_mrizku(List<UIElement[]> dvourozmerne_pole)
       {

       int pocet_radku=dvourozmerne_pole.Count;
       int pocet_sloupcu=dvourozmerne_pole[0].Length;
       //definice radku
       RowDefinition rd=new RowDefinition();
       //definice sloupce
       ColumnDefinition cd=new ColumnDefinition();

       //nejake rozmery
       rd.Height= new GridLength(100);
       cd.Width=new GridLength(100);

       for(int i=0;i<pocet_radku;i++)
       {
           mainGrid.RowDefinitions.Add (rd);
       }

       for(int i=0;i<pocet_sloupcu;i++)
       {
           mainGrid.ColumnDefinitions.Add (cd);
       }

    }

v tom by problém nebyl - horší je jak do příslušných chlívků dostat co potřebuješ - z kódu se totiž k vlastnostem jako je GridRow a GridColumn nedostaneš

 
Nahoru Odpovědět
7.10.2015 21:46
Avatar
Odpovídá na ostrozan
Patrik Valkovič:7.10.2015 21:57

Dostaneš, ale né klasicky přes Properties.

Controlka.SetValue(Grid.RowProperty, IndexOfRow);

například takto nastavíš pátý řádek.

MyButton.SetValue(Grid.RowProperty, 4)
Nahoru Odpovědět
7.10.2015 21:57
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Hit
Člen
Avatar
Hit:9.10.2015 23:50

Pánové díky za rady, nakonec jsem se to rozhodl vyřešit jiným způsobem, ovšem narazil jsem na jiný problém. A to, že nevím, jak na Canvas vykreslit několik stejných obrazců. Jedná se o to, že chci vedle sebe nakreslit např. 10 černých čtverců. Kód mám následující:

int width = 20;
int height = width;

SolidColorBrush black = new SolidColorBrush(Colors.Black);

Rectangle wall = new Rectangle();
wall.Width = width;
wall.Height = height;
wall.Fill = black;

Canvas.SetLeft(wall, 3);
Canvas.SetTop(wall, 3);
canvas.Children.Add(wall);

Tím dosáhnu vykreslením jednoho čtverce, nevím ovšem jak nakreslit ten samý čtverec o např. 30 pixelů vedle.

Editováno 9.10.2015 23:53
Nahoru Odpovědět
9.10.2015 23:50
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Hit
TomasGlawaty:10.10.2015 9:56

Projeď to 10x cyklem a SetLeft vždy zvětši o šířku čtverce (tzn. 3, 33, 63, 93 ...)
Takhle vykreslíš 10 čtverečků vedle sebe :)

Editováno 10.10.2015 9:57
 
Nahoru Odpovědět
10.10.2015 9:56
Avatar
Hit
Člen
Avatar
Odpovídá na TomasGlawaty
Hit:10.10.2015 14:53

To bohužel nejde, protože ten čtverec se vykreslí až při canvas.Children­.Add(wall); . A jakmile zkusím ten čtverec přidat znovu dostanu error, protože už Canvas tenhle objekt obsahuje... Logicky by to šlo vyřešit tím, že bych si vytvořil třeba 10 stejných čtverců s jiným jménem, ale určitě musí být lepší řešení.

Editováno 10.10.2015 14:54
Nahoru Odpovědět
10.10.2015 14:53
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Hit
TomasGlawaty:10.10.2015 17:19

Musíš instanci toho objektu vytvořit v tom cyklu...

int x = 0;
int y = 0;

for (int i = 0; i < 10; i++)
{
    Rectangle rec = new Rectangle();
    rec.Width = 30;
    rec.Height = 30;
    Canvas.SetLeft(rec, x);
    Canvas.SetTop(rec, y);
    rec.Stroke = Brushes.Black;

    x += 30;

    canvas.Children.Add(rec);
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
10.10.2015 17:19
Avatar
Hit
Člen
Avatar
Odpovídá na TomasGlawaty
Hit:10.10.2015 17:50

Já jsem ale idiot! Díky moc :D

Nahoru Odpovědět
10.10.2015 17:50
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Hit
TomasGlawaty:10.10.2015 18:21

Není zač :)

 
Nahoru Odpovědět
10.10.2015 18:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.