Laden...

Aus WPF Template Code Behind starten

Erstellt von m.grauber vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.877 Views
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren
Aus WPF Template Code Behind starten

Hallo,

in einem XAML-Template eines Contextmenüs, möchte ich dafür sorgen, dass beim Loaded aller Contextmenüs zukünftig ein Code Behind ausgeführt wird:


<Style x:Key="{x:Type ContextMenu}" TargetType="{x:Type ContextMenu}">
  <Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type ContextMenu}">
            <ControlTemplate.Triggers>
                <EventTrigger RoutedEvent="Loaded">
                      <!-- Hier meinen Code Behind aufrufen: MyLoaded() -->
                </EventTrigger>
             </ControlTemplate.Triggers>
...

Nur was muss in dieser Zeile stehen? Und falls das nicht über das Template geht, welchen Code benötige ich in C#?

Es soll ein allgemeingültiges ContentMenu-Template bleiben.

Besten Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

5.299 Beiträge seit 2008
vor 11 Jahren

jo, was sich MS mit diese komische EventTrigger gedacht hat, ist mir auch nicht so klar.
Das einzige, wassich damit bisher mit Bordmitteln hingekriegt habe, ist iwelche StoryBoards zu starten.

Allerdings mit "Hilfe von aussen" kann man per Event sogar direkt was im ViewModel anstoßen - gugge http://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/

Der frühe Apfel fängt den Wurm.

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren

Hallo Erfinder des Rades,

vielen Dank für den Tipp! 👍 Ich habe inzwischen in die Richtung probiert, daß wird aber etwas aufwendiger. Da ich es bei allen ContextMenüs im Loaded ausführen möchte, gibt es evtl. noch einen anderen Weg:

Wie "abonniere" ich das Loaded des Standard-Context-Menüs (ohne es abzuleiten)?

Mit ContextMenu.Loaded += ... geht das ja nicht.

Mein Code sollte dann bei jedem erstellen eines neuen ContextMenüs abgearbeitet werden.

(Mein Template kann dann einfacher bleiben und muss das nicht berücksichtigen)

Wie klappt das dann? 🤔

Besten Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

X
9 Beiträge seit 2013
vor 11 Jahren

Hallo m.grauber,

da ich gerade an etwas ähnlichem arbeite, kann ich Dir denke ich helfen.

Mit den Triggers kannst Du so direkt keinen Code-Behind ausführen lassen. Was Du aber machen kannst, ist folgendes

In App.xaml


<Application.Resources>
    <ControlTemplate x:Key="MyContextMenuTemplate">
        <ContextMenu />
    </ControlTemplate>
</Application.Resources>

In Deiner Code-Behind


var myContextMenu = (Application.Current.Resources["MyContextMenuTemplate"] as ControlTemplate).LoadContent() as ContextMenu;

myContextMenu.Loaded += ContextMenu_Loaded;

Hoffe, das hilft

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren

Hallo Xalir,

vielen Dank! Das ist wirklich Top! 👍 und wäre sicher die Lösung!!!

Leider habe ich wieder einmal einen Sonderfall:

Erstens ist x:Key im Style und nicht im darunter liegendem ControlTemplate definiert. (Im darunter liegendem ControlTemplate darf ich daher leider kein Key mehr vergeben).

Zweitens hatte ich x:Key="{x:Type ContextMenu}" gesetzt, damit es für alle ContextMenüs gilt. Sobald ich hier einen Name zuweise, müsste ich bei jedem ContextMenü im Programm den Style angeben.

Drittens habe ich einmal versucht, dann den Style trotzdem zu benennen und dann im Codebehind nach Style zu casten. Doch dieser Style hat leider kein .LoadContent() (oder etwas ähnliches) - Hier könnte man aber evtl. mit Trigger arbeiten.

Also ist nun zum Fortfahren derzeit das größte Problem, wie greife ich nun aus dem Codebehind auf den Style zu, wenn er mit x:Key="{x:Type ContextMenu}" bezeichnet ist? Ich habe bereits versucht eine Instanz des ContextMenüs zu bilden und dann mit .Style meinen Style auszulesen. Dieser ist aber immer null.

Besten Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

X
9 Beiträge seit 2013
vor 11 Jahren

Ich verstehe noch nicht so ganz Dein Problem. Soweit ich das sehe, benötigst Du keinen Style, da Du das Aussehen des Controls nicht änderst. Daher könntest Du auf Styles verzichten und direkt das ControlTemplate als Ressource nutzen und einen x:Key vergeben.

Falls Du doch weiterhin das Aussehen verändern willst, was spricht denn dagegen


<Application.Resources>
    <ControlTemplate x:Key="MyContextMenuTemplate">
        <ContextMenu Style="myStyle" />
    </ControlTemplate>
    <Style TargetType="ContextMenu" x:Key="myStyle">
        <!-- Hier Deine Style-Änderungen -->
    </Style>
</Application.Resources>

Alternativ geht auch noch C#-Code direkt in XAML einzubetten. Da ich das ganze aus dem Kopf jetzt nicht zusammenkriege, verweise ich da auf Google.