8 Královen - Button.Location (WPF) – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

8 Královen - Button.Location (WPF) – .NET – Fórum – Programujte.com8 Královen - Button.Location (WPF) – .NET – Fórum – Programujte.com

 

Petrroll0
Stálý člen
1. 5. 2010   #1
-
0
-

Zdar, snažím se vykreslit šachovnici. Vytvořím pole Buttonů, pomocí 2x for vytvořím všech 64 buttonů. Ale jak je mám posadit na tu správnou pozici. Hledal jsem a našel jsem že buttony mají mít vlastost "Location" ale tu prostě nemohu najít. Pravděpodobně není v WFP implementovaná a podporuje jí jí pouze WinForm. (FW 4.0, VS 2010). Zatím s GUI nemám moc velké zkušenosti.

 {

public MainWindow()
{
InitializeComponent();
vykreslySachovnici();
}
public void vykreslySachovnici()
{
Button[ , ] sachovnice = new Button[8, 8];
int x = 100;
int y = 100;
int indx = 0;
for (int i = 0; i == 8; i++)
{
for (int j = 0; j == 8; j++)
{
sachovnice[i, j] = new Button();
sachovnice[i, j].Margin = new System.Windows.Thickness(x, y, 0, 0);
sachovnice[i, j].Name = "btn" + i.ToString() + j.ToString();
sachovnice[i, j].Width = 50;
sachovnice[i, j].Height = 50;
sachovnice[i, j].TabIndex = indx;
indx++;

}
}
}
}

ERRORs:
"Error 1 'System.Windows.Controls.Button' does not contain a definition for 'Location' and no extension method 'Location' accepting a first argument of type 'System.Windows.Controls.Button' could be found (are you missing a using directive or an assembly reference?) C:\Users\Petrroll\documents\visual studio 2010\Projects\8_kraloven\8_kraloven\MainWindow.xaml.cs 38 38 8_kraloven
"
Kdyby si někdo myslel že si vymýšlím.

EDIT: Když to zkompiluji tak se nic nevykreslí. Je mi jasný že je nějak musím připojit k GUI. Ale již zde není (u WPF) Controls.Add.

Nahlásit jako SPAM
IP: 92.62.224.–
KIIV
~ Moderátor
+43
God of flame
1. 5. 2010   #2
-
0
-

tak zkus hledat vlastnosti top a left..

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Petrroll0
Stálý člen
1. 5. 2010   #3
-
0
-

Nejsou, zkusil jsem to prozatím vyřešit.

sachovnice[i, j].Margin = new System.Windows.Thickness(x, y, 0, 0);

Ale nemohu zkusit jestli to jede, protože mi objekty nejdou vykreslit.
Když to zkompiluji tak se nic nevykreslí. Je mi jasný že je nějak musím připojit k GUI. Ale již zde není (u WPF) Controls.Add.

Nahlásit jako SPAM
IP: 92.62.224.–
Kolemjdoucí
~ Anonymní uživatel
71 příspěvků
1. 5. 2010   #4
-
0
-

To Petrroll :
Vytvoř dynamicky canvas, ten přidej do ovládacích prvků okna. V canvasu můžeš všem prvkům v něm absolutně nastavit pozici.
Myslím, že to dělá statická funkce Canvas.SetLeft, Canvas.SetTop (nebo nějak podobně). Pak stačí přidat jednotlivé buttony do Children příšlušné instance Canvasu.

Nahlásit jako SPAM
IP: 83.208.250.–
Kolemjdoucí
~ Anonymní uživatel
71 příspěvků
1. 5. 2010   #5
-
0
-

Jinak ke GUI většinou připojíš přes metodu Addchild.

Nahlásit jako SPAM
IP: 83.208.250.–
Petrroll0
Stálý člen
1. 5. 2010   #6
-
0
-

V tomhle trochu plavu. Vytvořím si canvas, poté do něj pomocí nazevCanvasu.Children.Add(hraciPlocha[i, j]) přidám danou instanci. Ale jak pak nastavím pozici vůči (v canvasu).
EDIT: Nebo se do jednoho canvasu nedá přidat více než jeden button?

<Window x:Class="WpfApplication1.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="8 Královen" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Canvas Grid.Row="1" Height="311" HorizontalAlignment="Left" Margin="0,0,0,0" Name="hraciPole" VerticalAlignment="Top" Width="502" />
</Grid>
</Window>


hraciPole.Children.Add(sachovnice[i, j]);


EDIT2: Jinak než přes canvas to vykreslit nelze?

Nahlásit jako SPAM
IP: 92.62.224.–
Kolemjdoucí
~ Anonymní uživatel
71 příspěvků
1. 5. 2010   #7
-
0
-

Do Canvasu jde přidat víc věcí. K vykreslení se nemusí použít, leč má velkou výhodu v tom, že všem prvkům v něm lze nastavit pozici. Jinak do většiny ovládacích prvků ve WPF můžeš většinu všech ostatních ovládacích prvků, takže je vlastně celkem jedno, do čeho to dáš, protože i do toho pak následně zas můžeš vložit canvas a do canvasu následně až ty buttony ( proto také to addchild).

Jinak funkční příklad:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
x:Class="WpfApplication1.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">

<Grid x:Name="LayoutRoot">
<Canvas x:Name="canvasik" Margin="132,125,108,111" Background="Black"/>
</Grid>
</Window>

public MainWindow()
{
this.InitializeComponent();

Button btn = new Button();
btn.Width=100;
btn.Height=30;
Canvas.SetLeft(btn, 100);
Canvas.SetTop(btn, 20);
canvasik.Children.Add(btn);
// Insert code required on object creation below this point.
}

Nahlásit jako SPAM
IP: 83.208.250.–
Petrroll0
Stálý člen
1. 5. 2010   #8
-
0
-

Ok, díky moc. Mám pocit že to chápu, ale nechápu proč to pořád NIC nevykresluje.
Původní chyba opravena ale je zase nová.
Když teď zkompiluji tak vše problěhne bez problémů, ale GUI se pro změnu vůbec nevykreslí s chybou "'The invocation of the constructor on type 'WpfApplication1.MainWindow' that matches the specified binding constraints threw an exception.' Line number '3' and line position '9'."
Tady už přestávám chápat o co jde.

        public void vykreslySachovnici()

{
Button[ , ] sachovnice = new Button[8, 8];
int x = 100;
int y = 100;
int indx = 0;

for (int i = 0; i /*==*/ < 8; i++)
{
for (int j = 0; j /*==*/ < 8; j++)
{
sachovnice[i, j] = new Button();
Canvas.SetLeft(sachovnice[i, j], x);
Canvas.SetTop(sachovnice[i, j], y);
sachovnice[i, j].Name = "btn" + i.ToString() + j.ToString();
sachovnice[i, j].Width = 50;
sachovnice[i, j].Height = 50;
sachovnice[i, j].TabIndex = indx;
indx++;
if ((i + j) % 2 == 0)
{
sachovnice[i, j].Foreground = Brushes.Black;

}
else
{
sachovnice[i, j].Foreground = Brushes.White;
}
x += 50;
herniPole.Children.Add(sachovnice[i, j]);


}

x = 100; y += 50;
}
}


<Window x:Class="WpfApplication1.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="8 Královen" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Canvas x:Name="herniPole" Background="Purple" Height="311" Grid.Row="1" />
</Grid>
</Window>

Nahlásit jako SPAM
IP: 92.62.224.–
Kolemjdoucí
~ Anonymní uživatel
71 příspěvků
1. 5. 2010   #9
-
0
-

Nic to nevykresluje, protože ty forcykly neprojedou ani jednou.
Dělá to něco, dokud je splněna ta podmínka, ale ta není nikdy.
Stačí tam změnit i==8 a j==8 na i<8 a j <8.

Nahlásit jako SPAM
IP: 83.208.250.–
Petrroll0
Stálý člen
1. 5. 2010   #10
-
0
-

Jj, všimljsem si toho, teď nová chyba.
Když teď zkompiluji tak vše problěhne bez problémů, ale GUI se pro změnu vůbec nevykreslí s chybou "'The invocation of the constructor on type 'WpfApplication1.MainWindow' that matches the specified binding constraints threw an exception.' Line number '3' and line position '9'."
Tady už přestávám chápat o co jde.
PS: Omlouvám se že vás otravuji celý den, ale to co jsem se za dnešek dozvěděl o GUI je víc než vůbec kdy předtím.

Nahlásit jako SPAM
IP: 92.62.224.–
Kolemjdoucí
~ Anonymní uživatel
71 příspěvků
1. 5. 2010   #11
-
0
-

Já váš kód zkoušel a v konstruktoru mainwindow jsem zavolal jen metodu vykreslisachovnici a vse se mi vykreslilo. Nepridal jste jeste neco do toho kodu?

Nahlásit jako SPAM
IP: 83.208.250.–
Petrroll0
Stálý člen
1. 5. 2010   #12
-
0
-

Divné, pokud začnu NOVÝ projekt a nakopíruji tam VŠE ze starého tak to funguje. Pokud to však zkusím ve starém nejde to. Všem a hlavně Kolemjdoucímu děkuji za pomoc.

Nahlásit jako SPAM
IP: 92.62.224.–
JardaJirava0
Stálý člen
3. 5. 2010   #13
-
0
-

Ahoj, nejspíše jdu s křížkem po funuse, ale není třeba používat jen Canvas. Když už skoro ve všech ukázkách máš deklarovaný Grid, tak jsi mohl využít ten, pak bys nemusel nic počítat a navíc jsi mohl mít ten layout dynamický (což nemusí být správně). V gridu by sis nadeklaroval 8 sloupců a 8 řádků a pak si jednotlivé Buttony vkládal do jednotlivých políček.
Dle mě je to i logičtější a nemusíš neustále přepočítávat polohu jednotlivých tlačítek.
Další varianta by byla napsat si vlastní Panel (nejspíše založeném na Canvas), který by dokázal tlačítka správně vykreslovat.

Pěkný den,

Jarda Jirava

Nahlásit jako SPAM
IP: 194.213.35.–
MCAD, MCPD
http://jirava.net/blog
http://xaml.cz - Magazín moderních technologií založených na XAML
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 37 hostů

Podobná vlákna

8 Královen - LOGICKÝ problém — založil Petrroll

Window location — založil Standa

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý