Diskuze: C# WPF binding
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj,
jak vypadá definice Tvého gridu?
Je v něm definován potřebný počet řádků a sloupců?
Jojo, tabulku mám definovanou
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Souradnice}" Grid.Column="{Binding Radek}" Grid.Row="{Binding Sloupec}" BorderThickness="0"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
Všimol som si
Grid.Column="{Binding Radek}" -- Column je stĺpec, nebude tam chyba? Nemám v
práci VS, nemôžem to testnúť.
Proč tam máš ItemsControl? To vůbec nepotřebuješ, když vkládáš
tlačítka do Gridu.
Vytvoř si tlačítko a zavolej na něj
MojeTlacitko.SetValue(Grid.RowProperty,KteryRadek);
Potom jej vlož do Gridu.
ItemsControl je panel sám o sobě.
Libor Šimo (libcosenior) dobrý postřeh, už jsem si to opravil. Je to však jen drobná chybka,
která můj problém neřeší.
Patrik Valkovič ItemsControl mi umožňuje pracovat s tlačítky, kterých bude
64 (opravdu bych je nechtěl tvořit ručne, natož, kdybych chtěl změnit
jeden parametr, tak bych ho musel měnit 64x) v kolekci.
(ObservableCollection)
To zmíněné tlačítko je jen předloha, jak by mělo vypadat těch 64
tlačítek. V designeru nejde
ani vidět. Abych vše uvedl na pravou míru, snažím se vytvořit šachovnici
z tlačítek.
Těch 64 tlačítek se opravdu objeví, ale všechny jsou namrskané v prvním
řádku a prvním sloupci.
Děkuji všem za pomoc. Řešení už jsem našel. Problém rozhodně nebyl s bindingem, protože když jsem tam dal přímo hodnotu, tak to přes to nefungovalo. Problém jsem sice nevyřešil, ale buttony jsem si vytvořil přímo v code behind a z xamlu jsem vše vymazal. Omlouvám se za svojí neznalost, ale nevěděl jsem, že lze takto jednoduše vytvářet buttony v code behind...
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
Button tlacitko = new Button();
tlacitko.SetValue(Grid.ColumnProperty, i);
tlacitko.SetValue(Grid.RowProperty, j);
grid.Children.Add(tlacitko);
// Přidání do kolekce
policka.Add(new Policko(tlacitko, (Souradnice)i));
}
}
Po spustení programu sa v XAML buttony neukážu?
Automatická změna vzhledu se ve WPF neřeší přes ItemsControl, ani nic
podobného, ale přes styly. Stylu nadefinuješ Type, ale nenadefinuješ mu Key.
Potom se všem tlačítkám změní design. Eventuelně můžeš stylu nastavit
Key a v cyklu přidávat pouze Style. Elegantní a krátké.
Jinak tvoje řešení : však to je přesně to, co jsem psal
Ukázali se, ale všechny byli zarovnané v prvním řádku a prvním sloupci... všechny tam byli natlačené
Proč Grid?
Ovšem,že jde použít, ale jako pro řazení kontrolek stejného typu za/pod
sebe slouží speciální kontejner StackPanel, tak pro tvůj účel je
nejvhodnější WrapPanel.
Mimochodem, ani 64 tlačítek ručně v designeru nezabere víc jak tři minuty - když víš jak na to
Takže návod na šachovnici snadno a rychle jako podle Ládi Hrušky
*budeme potřebovat pouze designer, myš a 5minut času
*
tolik tedy Láďa Hruška - spíš jen tak pro zajímavost
a zjištění souřadnic, jakožto i další obsluha tlačítka je pak taky jednoduchou záležitotí s použitím směrovaných událostí můžeš zachytávat klik na všech 64 dítkách-tlačítkách na rodičovi-wrapPanelovi (samozřejmě i na tvém Gridu) a obsloužit je díky tomu v jedné jediné metodě
private void wrapPanel1_Prewiew_MouseLeftButtonDown(object sender,MouseButtonEventArgs e)
{
//pretypovani zdroje na Button
Button butt= e.Source as Button;
//zjisteni indexu - wrapPanel je kolekce a tak s nim muzeme pracovat
//jako (skoro) s jakoukoli jinou kolekci
int index=wrapPanel1.Children.IndexOf (butt);
//zjisteni souradnic naklikleho Buttonu (pri rastru 8x8)
int x=0;
int y=0;
while(index/8>0)
{
x=index-=8;
y++;
}
//tvuj kod
}
Páni díky. Už jsem tak nějak dopředu přemýšlel, jak vytvořit společnou údálost ClickOnButton pro všechny tlačítka. Rozhodně využiju. Taky jsem nevěděl, že stack/wrap panel, pracuje se svými kontrolkami v kolekci, ale mohlo mě to napadnout...
Jsem rád, že ti to pomůže - no a když už jsem si s tím hrál tak jsem vyřešil i jak z toho rastru udělat šachovnici - střídání tmavých a světlých polí - tak pokud bys měl zájem.
Nechci ti ale brát radost z vymýšlení vlastních postupů a třeba to už máš vyřešené .
Vyřešil jsem to svým způsobem, ale jestli ho máš elegantnější, tak se bránit nebudu.
public enum Souradnice
{
A8, B8, C8, D8, E8, F8, G8, H8,
A7, B7, C7, D7, E7, F7, G7, H7,
A6, B6, C6, D6, E6, F6, G6, H6,
A5, B5, C5, D5, E5, F5, G5, H5,
A4, B4, C4, D4, E4, F4, G4, H4,
A3, B3, C3, D3, E3, F3, G3, H3,
A2, B2, C2, D2, E2, F2, G2, H2,
A1, B1, C1, D1, E1, F1, G1, H1
}
// Zjistí řádek a sloupec ze souřadnice
Radek = (int)Math.Floor((float)Souradnice / 8);
if (Souradnice.ToString().Contains("A"))
Sloupec = 0;
else if (Souradnice.ToString().Contains("B"))
Sloupec = 1;
else if (Souradnice.ToString().Contains("C"))
Sloupec = 2;
else if (Souradnice.ToString().Contains("D"))
Sloupec = 3;
else if (Souradnice.ToString().Contains("E"))
Sloupec = 4;
else if (Souradnice.ToString().Contains("F"))
Sloupec = 5;
else if (Souradnice.ToString().Contains("G"))
Sloupec = 6;
else if (Souradnice.ToString().Contains("H"))
Sloupec = 7;
// Obarví políčko na základě řádku a sloupce
if (Sloupec % 2 != Radek %2)
{
tlacitko.Background = Brushes.Black;
}
else
{
tlacitko.Background = Brushes.White;
}
Zpráva nad touto patří tobě, akorát jsem tě zapomněl označit...
Ještě jsem to trochu poupravil a ušetřil pár řádků...
public enum Souradnice
{
A8, B8, C8, D8, E8, F8, G8, H8,
A7, B7, C7, D7, E7, F7, G7, H7,
A6, B6, C6, D6, E6, F6, G6, H6,
A5, B5, C5, D5, E5, F5, G5, H5,
A4, B4, C4, D4, E4, F4, G4, H4,
A3, B3, C3, D3, E3, F3, G3, H3,
A2, B2, C2, D2, E2, F2, G2, H2,
A1, B1, C1, D1, E1, F1, G1, H1
}
// Zjistí řádek a sloupec ze souřadnice
Radek = (int)Math.Floor((float)Souradnice / 8);
Sloupec = (int)Souradnice % 8;
// Obarví políčko na základě řádku a sloupce
if (Sloupec % 2 != Radek %2)
{
tlacitko.Background = Brushes.Black;
}
else
{
tlacitko.Background = Brushes.White;
}
Mám něco podobného, ale o půlku kratšího - obarvuju jen černé pole - bílé už bílé je
Ty si to ale nech tak , pro kombinaci jiných barev.
Zobrazeno 17 zpráv z 17.