Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Hanz 06. 02. 2015, 23:13:55
-
Dobry den,
prechazim z Windows.Forms na wpf a rad bych naprogramoval jednoduchou hru. Z winforms jsem byl zvykly menit vlastnosti u vizuálních prvku jako Top, Left, ale ve WPF jsem neprisel na to, jak to udelat, když tam tyto vlastnosti neexistuji.
Nevite někdo prosim, jak se to resi ve wpf?
Dekuji
Honza
-
Zkousel jsem v XAML:
<Canvas KeyDown="OnKeyDown" Name="mainCanvas">
<Rectangle Canvas.Left="238" Canvas.Top="273" Height="14" Name="rctPaddle" Stroke="Black" Width="56" />
</Canvas>
a v kodu:
rctPaddle.SetValue(Canvas.LeftProperty, 50.0);
nicmene to nefunguje.
Honza
-
WPF a XAML používá bindingy, nauč se je taky používat - a obecně architekturu MVVM.
Jednoduchej způsob je: Vytvoř si ViewModel s property Left a Top a pak použij binding vůči tomu view modelu. Když změníš hodnotu v objektu viewmodelu, změní se ti pozice elementu v UI. A na volání příkazů z UI nepoužívej eventy, ale commandy.
Doporučil bych projít základní tutoriály na WPF, aby ses nesnažil aplikovat WinForms na WPF. To je velice špatně. Na youtube najdeš slušný tutoriály, jen se vyhni indum. Komplexnější práci s tim co potřebuješ (a lepší z pohledu WPF) uvidíš, až se s nim naučíš pracovat.
-
Ještě to nemam plne prostudovane, ale proc prosim, když mi napr Canvas mym pricinenim vygeneruje událost KeyDown v CSharp kodu, nenapada me abych k tomu musel něco pripisovat? Nevite?
private void OnKeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show("abc");
}
Dekuji
-
Ještě to nemam plne prostudovane, ale proc prosim, když mi napr Canvas mym pricinenim vygeneruje událost KeyDown v CSharp kodu, nenapada me abych k tomu musel něco pripisovat? Nevite?
private void OnKeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show("abc");
}
Dekuji
Celkom som nepochopil zmysel tvojej otázky.
K tomu canvasu, keď do googlu hodíš wpf canvas move element tak možno dostaneš odpoveď na tú otázku.
Napríklad ten pán sa v tom vyzná, takže skôr než začneš si niečo od neho prečítaj.
http://www.codeproject.com/Articles/15354/Dragging-Elements-in-a-Canvas (http://www.codeproject.com/Articles/15354/Dragging-Elements-in-a-Canvas)
-
Ve WPF máš obecně víc možností, jak to vyřešit.
Pomocí Canvasu můžeš používat gameUnit1.Canvas.Left, gameUnit1.Canvas.Right
<Grid>
<Canvas HorizontalAlignment="Left" VerticalAlignment="Top">
<Button Name="gameUnit1" Content="Button" Canvas.Top="10" Width="75" Canvas.Left="10"/>
</Canvas>
</Grid>
Pokud by si chtěl použít přímo Grid, použiješ něco ve stylu gameUnit2.Margin = new Thickness(10, 10, 0, 0);
<Grid>
<Button Name="gameUnit2" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
</Grid>
Jen bacha, WPF není určený k tvoření her a dřív nebo později narazíš na FPS limit. Doporučuji mrknout na XNA framework, i když už není podporován, malou hru v něm uděláš snadno.
-
Místo XNA frameworku hledej Monogame.
-
Zabývat se WPF bez zvládnutí MVVM je ztráta času, jenom tě to znechutí a vůbec to nepochopíš.
-
Dobře a vysvětlili byste mi ještě někdo, prosím, proč se nevyvolá ta událost?
Děkuji
-
Dobře a vysvětlili byste mi ještě někdo, prosím, proč se nevyvolá ta událost?
Děkuji
<Canvas Background="Lime" KeyDown="Canvas_KeyDown" MouseDown="Canvas_MouseDown" >
<TextBox Text="NAPIS SEM NIECO" />
</Canvas>
-
Protože žádná komponenta tam není fokusovatelná. Přihoď tam TextBox a začne to fungovat. Ale jen, když bude mít focus.
-
WPF a XAML používá bindingy, nauč se je taky používat - a obecně architekturu MVVM.
Jednoduchej způsob je: Vytvoř si ViewModel s property Left a Top a pak použij binding vůči tomu view modelu. Když změníš hodnotu v objektu viewmodelu, změní se ti pozice elementu v UI. A na volání příkazů z UI nepoužívej eventy, ale commandy.
Doporučil bych projít základní tutoriály na WPF, aby ses nesnažil aplikovat WinForms na WPF. To je velice špatně. Na youtube najdeš slušný tutoriály, jen se vyhni indum. Komplexnější práci s tim co potřebuješ (a lepší z pohledu WPF) uvidíš, až se s nim naučíš pracovat.
S tím voláním do UI jsem už poučený, děkuju všem.
Nevidím problém s vytvořením property ve ViewModelu v C#. Ale googlování, jak správně nabindovat např. Rectangle Left a Top s těmito propertami, jsem z toho nešťastný.
Nedokázal jsem vymyslet bindovací výraz.
Věděl byste mi prosím ještě toto poradit? Jsem v tom opravdu nový.
Děkuju moc
-
Myslel jsem Canvas.Left v Rectanglu v XAML, omlouvám se.
-
<Rectangle Canvas.Left="{Binding X}" Canvas.Top="50" Width="100" Height="100" Fill="Red"/>
X je property ve ViewModelu