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.

Člen

Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.