Laden...

Probleme mit Steuerung von Popup.IsOpen

Erstellt von DeSharper vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.650 Views
D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 6 Jahren
Probleme mit Steuerung von Popup.IsOpen

Hi,

Ich verzweifle gerade an einem eigentlich gar nicht so kompliziert erscheinenden Problem. Ich möchte beim Klick auf einen Button ein Menü mit etwa vier Punkten ausklappen. Es muss möglich sein diese Punkte irgendwie an eine Liste zu binden, hart codieren hilft mir hier nix. Dann soll man irgendwas in dem Menü auswählen können (der irgendwoander hinklicken) und dann schließt sich das wieder.
Ich arbeite sehr viel mit Styles und da es schon einen ButtonStyle gibt, wäre es wünschenswert, dass ich den für das neue Element nicht kopieren muss, aber natürlich soll der Button mit Extras auf den ersten Blick trotzdem genauso aussehen wie seinen Kollegen 😃

Das klang für mich jetzt erstmal sehr ähnlich wie eine nomale MenuBar (bzw. Menu/MenuItem in wpf). Aber das ist alles ein riesiges Geraffel, das brauche ich doch gar nicht. Ich hab ja gar kein dreistufiges Menü mit SubMenu und SubSubMenu, ich will nur ein einziges Menu ausklappen. Außerdem überlagert das MenuItem meinen schon fertig gestylten Button.
Also hab ich versucht das ganze zu verschlanken und nur einfach nur einen Button zu nehmen, der bei Klick (oder MouseOver, da bin ich noch offen) ein Popup öffnet. Das sah zunächst folgendermaßen aus:


    <ControlTemplate x:Key="ButtonWithPopupTemplate" TargetType="Button">
        <Border x:Name="Border">
            <Popup Name="Popup"
                   Placement="Top"
                   IsOpen="{TemplateBinding IsMouseOver}">
                <Border SnapsToDevicePixels="True" BorderThickness="1">
                    <ItemsControl ItemsSource="{Binding Path=MyList}"
                                  ItemTemplate="{DynamicResource MyListItemTemplate}"
                                  Style="{DynamicResource MyListStyle}" />
                </Border>
            </Popup>
        </Border>
    </ControlTemplate>

Da taucht nur das kleine Problem auf, dass das Popup meistens verschwindet, wenn ich mit der Maus drüberfahren will (manchmal wenn ich schnell bin, bleibt es auch stehen). Ich vermute, dass sich entweder IsMouseOver nur auf den Button bezieht und nicht auf das Popup selbst oder dass da ein Spalt dazwischen ist, und wenn ich da drüber bin, hat natürlich weder das Popup noch der button ein MouseOver... Außerdem will ich ja eigentlich dass das Popup bei einem KLICK auf den Button ausfährt.
Also hab ich versucht dem dummen WPF etwas expliziter zu sagen was ich möchte, aber wir scheinen uns irgendwie nicht richtig zu verstehen. Ich habs mit Triggern versucht - die ich zugegeben bisher nur für sehr simple Sachen wie Button disabled hat andere Farbe oder so verwendet hab. Jedenfalls kommt mein trauriger Versuch nichtmal am Compiler vorbei.


    <ControlTemplate x:Key="ButtonWithPopupTemplate" TargetType="Button">
        <Border x:Name="Border">
            <Popup Name="Popup"
                   Placement="Top"
                   IsOpen="{TemplateBinding IsMouseOver}">
                <Border SnapsToDevicePixels="True" BorderThickness="1">
                    <ItemsControl ItemsSource="{Binding Path=MyList}"
                                  ItemTemplate="{DynamicResource MyListItemTemplate}"
                                  Style="{DynamicResource MyListStyle}" />
                </Border>
                <Popup.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="Popup"  Property="IsOpen" Value="false"/>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition SourceName="Popup" Property="IsMouseOver" Value="false"/>
                            <Condition SourceName="Border" Property="IsMouseOver" Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter TargetName="Popup"  Property="IsOpen" Value="false"/>
                    </MultiTrigger>
                </Popup.Triggers>
            </Popup>
        </Border>
    </ControlTemplate>

Ich bekomme zwei Fehlermeldungen:

  • Der statische Member "IsOpenProperty" wurde nicht im Typ "Button" gefunden.
  • Mitglieder der Triggers-Sammlung müssen vom Typ "EventTrigger" sein.
    Erstens: Was soll das heißen... wurde nicht gefunden. Wieso sucht der auch im Button, ich hab doch gesagt TargetName=Popup? Und EventTrigger hilft mir doch auch nichts, die haben kein Setters-Property, dann kann ich IsOpen ja auch nicht auf true setzen.

Kann mir jemand sagen, was ich hier falsch mache? Oder vielleicht bin ich auch schon viel früher falsch abgebogen, womöglich gibt es eine ganz einfache Lösung für mein Problem.