Laden...

Inhalte von Pages werden nicht geladen

Letzter Beitrag vor 20 Tagen 6 Posts 224 Views
Inhalte von Pages werden nicht geladen

Hallo,

ich habe das Problem, dass wenn ich zu einer neuen Page navigiere, der Inhalt der Page nicht geladen wird beziehungsweise nur das xaml angezeigt wird, aber der code behind ignoriert wird.

Im ersten Block ist das Event für den Button, damit das Spiel gestartet wird (also die Page vom Spiel geöffnet wird). Der zweite Block ist das xaml der Page vom Spiel und der letzte Block ist das Code behind von der Page.

public partial class Menu : Page
{
    public Menu()
    {
        InitializeComponent();
        this.DataContext = DataContext;
    }

    /// <summary>
    /// Click event für den Start Button
    /// Startet das Spiel
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btn_start_Click(object sender, RoutedEventArgs e)
    {
        this.NavigationService.Navigate(new GameScreen());
        
    }
<Page x:Class="SpaceInvaders.GameScreen"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:SpaceInvaders"
     mc:Ignorable="d" 
     MaxHeight="750" MaxWidth="550" MinHeight="750" MinWidth="550"
   Title="GameScreen">
   <Canvas Name="GameField" Height="750" Width="550" Margin="0,0,0,0" Background="Black" Focusable="True" KeyDown="GameTimeEvent">
       <Polygon Name ="plgn_player" Fill="HotPink" Stroke="HotPink" StrokeThickness="1">
           <Polygon.RenderTransform>
               <TranslateTransform />
           </Polygon.RenderTransform>
       </Polygon>
   </Canvas>
</Page>
public partial class GameScreen : Page
{
   byte playerSpeed = 5;
   public GameScreen()
   {
       InitializeComponent();
       this.DataContext = DataContext;
       plgn_player.RenderTransform = new TranslateTransform();
       plgn_player.Points = new PointCollection
       {
           new Point(GameField.Width / 2 - 35,GameField.Height - 10),
           new Point(GameField.Width / 2 - 35, GameField.Height - 10 - 15),
           new Point(GameField.Width / 2 - 35+20,GameField.Height - 10 - 15),
           new Point(GameField.Width / 2 - 35+20,GameField.Height - 10 - 22),
           new Point(GameField.Width / 2 - 35+30,GameField.Height - 10 - 22),
           new Point(GameField.Width / 2 - 35+30,GameField.Height - 10 - 15),
           new Point(GameField.Width / 2 - 35+50,GameField.Height - 10 - 15),
           new Point(GameField.Width / 2 - 35+50,GameField.Height - 10)
       };
       GameField.Focus();
       GameField.KeyDown += GameTimeEvent;
   }
   private void GameTimeEvent(object sender, KeyEventArgs e)
   {
       TranslateTransform transform = (TranslateTransform)plgn_player.RenderTransform;
       double widthToLeft = (GameField.Width / 2 - 35) * -1;
       double widthToRight = Width - (GameField.Width / 2 - 35);
       if (e.Key == Key.Left || e.Key == Key.A)
       {
           if (transform.X > widthToLeft)
           {
               transform.X -= playerSpeed;
           }
       }
       if (e.Key == Key.Right || e.Key == Key.D)
       {
           if (transform.X < 280)
           {
               transform.X += playerSpeed;
           }
       }
   }
}

Nur so zur Info, aber diese Zeile Code hier

this.DataContext = DataContext;

kannst du ersatzlos streichen. Du weist der Eigenschaft DataContext den Wert der Eigenschaft DataContext zu. Bildlich gesprochen nimmst du den 5-EUR-Schein aus deinem Portmonee und steckst diesen 5-EUR-Schein wieder dorthin zurück.

Hat die Blume einen Knick, war der Schmetterling zu dick.

Mach ich dann. Danke sehr!

Benutze den Debugger ([Artikel] Debugger: Wie verwende ich den von Visual Studio?), setze passende Haltepunkte und überprüfe, welche Methoden ausgeführt werden.

Der Konstruktor sollte auf jeden Fall ausgeführt werden, nur wird evtl. das KeyDown-Ereignis vom Canvas nicht erkannt (dieses ist ja eine reine Zeichenfläche, kein Eingabeelement): erzeuge dieses Ereignis daher mal direkt für die Page.

Der Debugger hat mir gezeigt, dass die Logik vom Code-Behind verarbeitet wird und auch durchgegangen wird. Gezeigt wird mir davon, aber nix. Ich hab auch deinen Vorschlag ausprobiert und das Problem blieb das selbe. In einem seperaten Projekt hatte ich den gleichen xaml Code und die gleiche Logik dahinter und dort hat es funktioniert.

Mach deine Seite mal ein klein wenig höher (so 760 Pixel) und dann schau mal genau hin 😃

Hat die Blume einen Knick, war der Schmetterling zu dick.