ich bin zur Zeit damit beschäftigt ein Programm für kleine Kartrennen zu entwickeln. Dieses soll in der Lage sein die Zwischenzeiten, Rundenzeiten etc. aus einem XML-Stream zu erfassen und weiterzuverarbeiten. Die Erfassung funktioniert soweit schon ganz gut. Neben der Darstellung der Daten in einem DataGrid soll auch eine s.g. CircleMap enthalten sein. Diese ist so gedacht, dass jedes fahrende Kart hier als Punkt auf einem Kreis umläuft und eine Runde des Karts auf der Strecke eine Runde des jeweiligen Punktes auf dem Kreis entsprechen soll.
Da in diesem Fall dynamisch gezeichnet werden muss, entschied ich mich mein kleines Programm fortan nicht mehr als Windows Form, sondern als WPF Application zu entwickeln.
Leider bin ich was WPF angeht ein totaler Neuling. Deshalb habe ich mich mit Hilfe von video2brain, openbooks und dem Rest des Netzes versucht in die Thematik einzuarbeiten. Dabei stieß ich auf die open-source library Modern UI for WPF, welche ich gerne für mein Programm benutzen möchte.
Die XAML des MainWindow sieht folgender maßen aus:
<mui:ModernWindow x:Name="Main" x:Class="TimingToolWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mui="http://firstfloorsoftware.com/ModernUI"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ROWE Timing Tool"
Height="900" Width="1600"
WindowState="Maximized"
ContentSource="Pages/Timing.xaml"
Padding="10,0,10,0">
<mui:ModernWindow.MenuLinkGroups>
<mui:LinkGroup DisplayName="Timing">
<mui:LinkGroup.Links>
<mui:Link DisplayName="Timing Grid" Source="Pages/Timing.xaml"/>
</mui:LinkGroup.Links>
</mui:LinkGroup>
<mui:LinkGroup DisplayName="Strategy">
<mui:LinkGroup.Links>
<mui:Link DisplayName="Circle Map" Source="Pages/CircleMap.xaml"/>
</mui:LinkGroup.Links>
</mui:LinkGroup>
</mui:ModernWindow.MenuLinkGroups>
</mui:ModernWindow>
Auf der Page Timing.xaml befindet sich ein Button, der per Click einen Timer startet, der die XML-Dateien des Streams überprüft um immer die aktuellsten Daten aus dem Stream zu laden In der Code-behind Datei Timing.xaml.cs werden dazu Listen erzeugt und erweitert.
namespace TimingToolWPF
{
/// <summary>
/// Interaction logic for Timing.xaml
/// </summary>
public partial class Timing : UserControl
{
public string xmlFilePath { get; set; }
public string xmlFolderPath { get; set; }
public string Track { get; set; }
public string Meeting { get; set; }
public string Competition { get; set; }
private string extractPath;
private string sroFileName = "TEAM_INFO.TMP";
private int fileCount = 0;
public bool bgwIsWorking = false;
public string Session { get; set; }
public List<Car> lstCars = new List<Car>();
public List<Message> lstMessages = new List<Message>();
public List<Flag> lstFlags = new List<Flag>();
private List<string> fileNames;
public List<TimingList> lstTiming { get; set; }
public DispatcherTimer tmrXmlRefresh;
public BackgroundWorker bgwDataImport;
public System.Windows.Forms.FolderBrowserDialog fbdOpenXmls;
public Timing()
{...
Jetzt benötige ich diese Listen aber auch in der Page CircleMap.xaml. Hier liegt schon mein erstes Problem. Wie kann die CircleMap auf die Objekte aus Timing.xaml zugreifen? Oder wie kann ich die Objekte anders anlegen, sodass jede Page Zugriff auf sie hat?
Im Internet finde ich oft, dass man die Objekte bei der Navigation übergeben muss. Leider denke ich befindet sich die Navigation von einem ModernWindow nicht da wo sie sonst ist. Zumindest finde ich die Stelle nicht. Und selbst wenn, was mache ich dann wenn die Daten sich im Hintergrund aktualisieren? Etwas in der Art von "anwendugsweiten Objekten" wäre sehr hilfreich.
Das zweite Problem ist die generelle Umsetzung der CircleMap. Von den Windows Forms her weiß ich, dass ich Formen aus dem Code zeichnen kann. Unter WPF gibt es nun auch die Möglichkeit von Animationen. Daher war zunächst meine Idee, das ganze als eine Pfadanimation umzusetzen - den Kreis als Pfad, kleine Kreise für die Karts als Target. Für die Duration der Animation würde ich die Rundenzeit der letzten Runde nehmen. Ich scheitere jedoch schon daran eine einfache Ellipse als Animationspfad zu benutzen, geschweige denn, dass ich unterschiedlich viele Karts in unterschiedlichen Geschwindigkeiten darauf laufen lassen kann. Daher die Frage, ob mein Ansatz mit der Animation überhaupt Zielführend ist oder ob es nur über das eigenständige Zeichnen von Formen über die Code-behind Datei funktioniert?
Ich weiß das war jetzt viel. Aber ich bin gerade wirklich verzweifelt und muss das Chaos in meinem Kopf erst ordnen. Vielen Dank schonmal für eure Mühen.
LG Andy