Diskuze: WPF canvas odmítá SetTop()
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 13 zpráv z 13.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Přidej ještě tvoje metody SetTop a SetLeft.
Vidíš první 4 metody v kódu? Ono by to mohlo být ještě trochu rozepsanější, ale tohle budu řešit později. Nefungovalo ani
Canvas.SetTop(Pajdulak, Canvas.GetTop(Pajdulak) - 1);
a opačná varianta.
No vidím, už si WPF nepamatuji přesně a myslel jsem, že jsou to tvoje extension metody.
Pozice v Canvas nastavuj přímo na tvém obrázku Pajdulak.
Něco ve smyslu:
Pajdulak.SetValue(Canvas.TopProperty, 20d);
To číslo musí být typu double, jinak to nebude fungovat. Analogicky nastavíš Left.
Pořád nefunguje
. Doleva a
doprava to šlo i předtím, takže tímhle to asi nebude. No aspoň vím zas
něco víc o nastavování pozice.
Tohle je v pohodě, sice jsem měl pozadí nastaveno u <code>Window</code>, ale po přesunutí na <code>Canvas</code> to vypadalo stejně.
Nevidím tvůj xaml, ale máš něco špatně nastaveného právě tam. Protože když vemu ten tvůj kód a přidám k němu následují xaml, tak mi funguje pohyb do všech stran.
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
KeyDown="Window_KeyDown">
<Canvas x:Name="Pozadi">
<Label Content="X" x:Name="Pajdulak" Canvas.Left="100" Canvas.Top="100"/>
</Canvas>
</Window>
//XAML
<Window x:Class="minihra.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:minihra"
mc:Ignorable="d"
Title="Skakaci hra(d)" WindowStartupLocation="CenterScreen" ResizeMode="NoResize" Height="350" Width="525" Background="Black" KeyDown="Window_KeyDown">
<Canvas Name="Pozadi" Background="#ff00aaaf">
//Toto ted neni dulezite
<Image Source="finishIcon.ico" Canvas.Left="450" Canvas.Top="10" Height="35" Name="Finish"/>
</Canvas>
</Window>
//Dulezita cast C# (pridavani Pajdulak)
Pajdulak = new Image();
Pajdulak.Source = new BitmapImage(new Uri("pajdulak.png", UriKind.Relative));
Pajdulak.Height = 50;
Canvas.SetBottom(Pajdulak, 0);
Canvas.SetLeft(Pajdulak, 0);
Pozadi.Children.Add(Pajdulak);
Tento řádek to kazí:
Canvas.SetBottom(Pajdulak, 0);
Nejdřív místo toho zkus toto a ověř že to funguje:
Canvas.SetTop(Pajdulak, 0);
Pokud ano, tak zřejmě budeš chtít nastavit úvodní pozici uplně dolu. Tam zase záleží v jakém momentě ten kód voláš, tedy jestli už v tu chvíli je vykresleno Pozadi. Potom bys mohl použít něco jako toto:
Canvas.SetTop(Pajdulak, Pozadi.Height - Pajdulak.Height);
Ale to už si doladíš.
Zajímavé, první část funguje skvěle, druhá mi hodí panáčka taky
nahoru (a ještě k tomu blokovala vertikální posouvání, teď už to
záhadně nedělá). Hlavní problém vyřešen, klidně mi můžeš pomoct
doladit i zbytek 
Můžeš místo toho zkusit ActualHeight, tedy takto:
Canvas.SetTop(Pajdulak, Pozadi.ActualHeight - Pajdulak.Height);
Ale jak píšu, nevidím odkud to voláš. V konstruktoru okna je to moc
brzo, protože Pozadi ještě není v tu chvíli vykresleno.
Místo toho to zavolej radši třeba v události Window_Loaded, nebo na jiném
vhodném místě, zkrátka aby to bylo až po prvním vykreslení.
Tak díky, o události <code>Loaded</code> jsem nevěděl. Teď už funguje vše.
Zobrazeno 13 zpráv z 13.