Laden...

XAML - Events ohne CodeBehind?

Erstellt von HeinzTomato vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.765 Views
HeinzTomato Themenstarter:in
345 Beiträge seit 2005
vor 16 Jahren
XAML - Events ohne CodeBehind?

Hallo.
Ich möchte meine XAML-Dateien möglichst dynamisch laden. Was an sich ja auch funktioniert.

Allerdings möchte ich nicht auf Events verzichten. Wenn ich allerdings einem Element z.B. das Event "Click" verpasse

<Button Width="Auto" Height="Auto" Content="EDIT" Click="switchTxt" />

bekomme ich die Meldung:

Fehler	3	Für das Stammelement "Page" ist ein x:Class-Attribut erforderlich, damit Ereignishandler in der XAML-Datei unterstützt werden. Entfernen Sie entweder den Ereignishandler für das Click-Ereignis, oder fügen Sie dem Stammelement ein x:Class-Attribut hinzu. Zeile 27 Position 54.

Ist irgendwie ja auch plausibel.

Wenn ich allerdings das x:Class-Attribut einfüge und eine entsprechende Klasse baue:

<Page
	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/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
	x:Name="Page"		
	x:Class="PhoeniX.tst"    // <---------------
WindowTitle="Page"
	FlowDirection="LeftToRight"
Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
>
  public partial class tst  {
    void switchTxt(object sender, RoutedEventArgs args) {
     MessageBox.Show(sender.ToString());    
    }
  }

Bekomme ich beim XAML-Parser die Meldung, daß das Attribut x:Class unbekannt sei.

Das Attribut \"Class\" ist im XML-Namespace \"http://schemas.microsoft.com/winfx/2006/xaml\" nicht vorhanden. 

Derzeit behelfe ich mir damit, daß ich alle Elemente rekursiv durchsteppe und abhängig vom Namen das Event filtere:

for (int i = 0; i < wingrd.Children.Count; i++) {               // Alle Elemente der Grids durchsteppen
        FrameworkElement fwe = (FrameworkElement)wingrd.Children[i];
        if (fwe.Name == "butSave") {                                  // Event-Handler für den Speichern-Button
          Button savBut = (Button)fwe;
          savBut.Click += new RoutedEventHandler(savBut_Click);
        }
        if (fwe.Name == "butAbort") {                                 // Event-Handler für den Abbrechen-Button
          Button abortBut = (Button)fwe;
          abortBut.Click += new RoutedEventHandler(abortBut_Click);
        }
      }
    }

Nicht wirklich eine schöne Lösung. Irgendwelche Tipps?

Mein Haus, mein Viertel, mein Blog

F
722 Beiträge seit 2005
vor 16 Jahren

hallo,

wann kommt denn die letztgenannte meldung? wenn sie nur im xaml designer auftaucht kannst du sie ignorieren, da dieser noch in der ctp phase ist.

HeinzTomato Themenstarter:in
345 Beiträge seit 2005
vor 16 Jahren

Naja. Die Meldung ist eine Exception, die der XAML-Parser schmeisst:

XmlTextReader xmlReader = new XmlTextReader(fname);
obj = XamlReader.Load(xmlReader);

mit ignorieren ist da also nix. Kann da nix einlesen.

Das der Designer von MS noch einige Macken hat ist klar. Aurora ist aber leider noch schlimmer.

Mein Haus, mein Viertel, mein Blog

F
722 Beiträge seit 2005
vor 16 Jahren

dann hilft wohl nur selber zu parsen.

B
10 Beiträge seit 2007
vor 16 Jahren

hallo,

ich bin auch auf das problem gestossen.
dynmisch eine xaml datei zu laden, da ist es besser, alles was mit event/ trigger etc. zu tun hat, als code-behind abzuarbeiten. das laden einer xaml datei, in der verweise auf event-aufrufe usw. sind, ist so nicht möglich.

deine schleife über alle grid-children kann ja eine unmenge an Eventhandlern erzeugen. bei mir waren so viele event-handler vorhanden, dass die perfomance
probleme machte, insbesondere bei schnellen maus-bewegungen.

ich habe bei mir in dem übergeordneten element (canvas usw.) lediglich 3 eventhandler (mouse-move, mouse-leave,mouse-click) implementiert (code-behind) , unmittelbar nach dem einlesen.

beim mouse-move z.b. frage ich dann mittels VisualTreeHelper.HitTest-Abfrage alles ab und kann dazu noch filtern. (HitTest abfrage mit continue - option und Callback-Methode ... klingt schlimmer als es ist)

die visual tree abfrage erlaubt es mir sogar, überlappende elemente (rechteck auf rechteck usw.) fein erkennen zu können.

generell muss ich zu xaml sagen : es ist eine interessante und schöne umgebung , aber das ziel der trennung von grafik und codierung wird nie gelingen.
einiges ist noch "buggy" (die ViewBox z.B. lässt mich langsam verzweifeln 🙂 )
und der Microsoft Expression Blend , mit dem ich parallel arbeite, der hat an einigen stellen noch gravierende schwächen.

bis denne - ein schönes relaxtes sonniges wochenende 😁