Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Hanz 06. 02. 2015, 23:13:55

Název: Posun vizuálního objekt ve WPF
Přispěvatel: 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
Název: Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
Přispěvatel: Hanz 06. 02. 2015, 23:46:42
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
Název: Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
Přispěvatel: Cyr 07. 02. 2015, 00:03:41
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.
Název: Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
Přispěvatel: Hanz 07. 02. 2015, 01:07:07
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?

Kód: [Vybrat]
private void OnKeyDown(object sender, KeyEventArgs e)
 {
            MessageBox.Show("abc");
}

Dekuji
Název: Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
Přispěvatel: Adusko 07. 02. 2015, 09:05:01
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?

Kód: [Vybrat]
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)
Název: Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
Přispěvatel: holoubekm 07. 02. 2015, 10:12:45
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.
Název: Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
Přispěvatel: Tomáš Roll 07. 02. 2015, 11:04:25
Místo XNA frameworku hledej Monogame.
Název: Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
Přispěvatel: Tomáš Roll 07. 02. 2015, 11:56:51
Zabývat se WPF bez zvládnutí MVVM je ztráta času, jenom tě to znechutí a vůbec to nepochopíš.
Název: Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
Přispěvatel: Hanz 07. 02. 2015, 12:59:06
Dobře a vysvětlili byste mi ještě někdo, prosím, proč se nevyvolá ta událost?

Děkuji
Název: Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
Přispěvatel: Adusko 07. 02. 2015, 13:22:41
Dobře a vysvětlili byste mi ještě někdo, prosím, proč se nevyvolá ta událost?

Děkuji

Kód: [Vybrat]
        <Canvas Background="Lime" KeyDown="Canvas_KeyDown" MouseDown="Canvas_MouseDown" >
            <TextBox Text="NAPIS SEM NIECO" />
        </Canvas>
Název: Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
Přispěvatel: Tomáš Roll 07. 02. 2015, 13:31:09
Protože žádná komponenta tam není fokusovatelná. Přihoď tam TextBox a začne to fungovat. Ale jen, když bude mít focus.
Název: Posun vizuálního objektu ve WPF
Přispěvatel: Hanz 09. 02. 2015, 18:29:13
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
Název: Re:Posun vizuálního objekt ve WPF
Přispěvatel: Hanz 09. 02. 2015, 18:50:33
Myslel jsem Canvas.Left v Rectanglu v XAML, omlouvám se.
Název: Re:Posun vizuálního objekt ve WPF
Přispěvatel: Tomáš Roll 09. 02. 2015, 19:27:50
Kód: [Vybrat]
<Rectangle Canvas.Left="{Binding X}" Canvas.Top="50" Width="100" Height="100" Fill="Red"/>

X je property ve ViewModelu