Posun vizuálního objekt ve WPF

Hanz

Posun vizuálního objekt ve WPF
« kdy: 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
« Poslední změna: 09. 02. 2015, 08:52:44 od Petr Krčmář »


Hanz

Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
« Odpověď #1 kdy: 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

Cyr

Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
« Odpověď #2 kdy: 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.

Hanz

Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
« Odpověď #3 kdy: 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

Adusko

Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
« Odpověď #4 kdy: 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


holoubekm

Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
« Odpověď #5 kdy: 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.

Tomáš Roll

Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
« Odpověď #6 kdy: 07. 02. 2015, 11:04:25 »
Místo XNA frameworku hledej Monogame.

Tomáš Roll

Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
« Odpověď #7 kdy: 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íš.

Hanz

Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
« Odpověď #8 kdy: 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

Adusko

Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
« Odpověď #9 kdy: 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>

Tomáš Roll

Re:Jak pomocí kódu posunout vizuální objekt ve WPF?
« Odpověď #10 kdy: 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.

Hanz

Posun vizuálního objektu ve WPF
« Odpověď #11 kdy: 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

Hanz

Re:Posun vizuálního objekt ve WPF
« Odpověď #12 kdy: 09. 02. 2015, 18:50:33 »
Myslel jsem Canvas.Left v Rectanglu v XAML, omlouvám se.

Tomáš Roll

Re:Posun vizuálního objekt ve WPF
« Odpověď #13 kdy: 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