WPF ResizeGrip feuert keine Events

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Hallo

    Beschreibe bitte mal was genau du machen willst. Es gibt mehrere Ansätze.
    Und zeige mal deinen Code.
    In der WPF gibt es nämlich für fast jedes Event auch das Preview-equivalent.

    Hierfür schau dir mal den Unterschied zwischen Tunneling und Bubblingevents an.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Beschreibe bitte mal was genau du machen willst

    Bluespide schrieb:

    ich versuche gerade einen Doppelklick auf das ResizeGrip des Fenster abzufangen

    //Edit: Ich möchte, dass nach einem Doppelklick sich die Breite des Fenster an den Content des Windows anpasst. Die Breite würde ich dann berechnen.

    Ich habe einfach ein kleines Beispielprojekt angelegt mit Window:

    XML-Quellcode

    1. <Window x:Class="WpfApp1.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:WpfApp1"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="200" Width="200"
    9. AllowsTransparency="True" WindowStyle="None" ResizeMode="CanResizeWithGrip">
    10. <Grid>
    11. <ResizeGrip x:Name="RG" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="10" Height="10" />
    12. </Grid>
    13. </Window>


    Und im CS:

    C#-Quellcode

    1. public MainWindow() {
    2. InitializeComponent();
    3. this.RG.Background = Brushes.Red;
    4. this.RG.MouseDoubleClick += Message;
    5. this.RG.MouseDown += Message;
    6. this.RG.MouseEnter += Message;
    7. this.RG.MouseLeave += Message;
    8. this.RG.MouseLeftButtonDown += Message;
    9. this.RG.MouseMove += Message;
    10. this.RG.MouseUp += Message;
    11. this.RG.PreviewMouseDoubleClick += Message;
    12. this.RG.PreviewMouseDown += Message;
    13. this.RG.PreviewMouseUp += Message;
    14. }
    15. private void Message(object sender, EventArgs e) {
    16. MessageBox.Show("Test");
    17. }


    Aber keiner der Events wird gefeuert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bluespide“ ()

    Hallo @Bluespide

    OK, jetzt wo ich den Code sehe weis ich auch warum. Ist aber auch ein gemeiner Stolperstein. :P
    Das liegt daran das dein Control auch gar nicht geklickt wird/werden kann. Der Grund dafür ist das dein ResizeGrip unter einem anderen ResizeGrip liegt.

    Du hast das Property ResizeMode des Window auf ResizeWithGrip festgelegt. Dieses bewirkt das die WPF ein ResizeGrip ÜBER alle anderen im Window vorhandenen Controls Rendert.
    Was klar ist, denn wenn ResizeWithGrip festgelegt wurde muss das Fenster sicherstellen das egal welche Controls du im Fenster platziert hast man immer den ResizeGrip zum ändern der Größe zur Verfügung hat.

    Dein ResizeGrip kann also nicht geklickt werden. Stelle das Property ResizeMode auf CanResize und alle Events werden gefeuert, da nun nur noch "dein" ResizeGrip verohanden ist.

    Bluespide schrieb:

    //Edit: Ich möchte, dass nach einem Doppelklick sich die Breite des Fenster an den Content des Windows anpasst. Die Breite würde ich dann berechnen.

    Hast du dir auch schon mal folgendes angesehen?

    XML-Quellcode

    1. SizeToContent="WidthAndHeight"


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Hallo Nofear23m,

    schon einmal Danke. Du hast recht, wenn ich das Window auf "CanResize" stelle, dann werden die Events gefeuert, aber leider funktioniert das ResizeGrip an sich dann nicht mehr. Anscheint müsste ich das dann komplett selbst implementieren. Das ist ja ärgerlich. Mein Beispiel war aber auch so nicht ganz korrekt habe ich gerade bemerkt. Eigentlich setzt ich den Style des Windows und da habe ich dann das echte ResizeGrip und er legt nicht noch eins drüber, aber die Events werden trotzdem nicht gefeuert. Anscheint übernimmt er dann nur gewisse Eigenschaften und macht trotzdem sein eigenes draus.

    XML-Quellcode

    1. <Window x:Class="WpfApp1.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:WpfApp1"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="200" Width="200" Background="Transparent">
    9. <Window.Style>
    10. <Style TargetType="{x:Type Window}">
    11. <Setter Property="AllowsTransparency" Value="True" />
    12. <Setter Property="WindowStyle" Value="None" />
    13. <Setter Property="ResizeMode" Value="CanResizeWithGrip" />
    14. <Setter Property="Template">
    15. <Setter.Value>
    16. <ControlTemplate TargetType="{x:Type Window}">
    17. <Border x:Name="bWindowShadow" BorderThickness="1" BorderBrush="#FF000000" Background="#FF404040">
    18. <Border BorderBrush="#FF000000" BorderThickness="1" Background="{TemplateBinding Background}">
    19. <Grid>
    20. <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" />
    21. <ResizeGrip x:Name="grpResize" Width="20" Height="20" Grid.Column="3" Grid.Row="1" VerticalAlignment="Bottom" HorizontalAlignment="Right" Visibility="Visible" Background="Red" MouseEnter="GrpResize_MouseEnter" />
    22. </Grid>
    23. </Border>
    24. </Border>
    25. </ControlTemplate>
    26. </Setter.Value>
    27. </Setter>
    28. </Style>
    29. </Window.Style>
    30. <Grid>
    31. </Grid>
    32. </Window>


    SizeToContent kann ich leider nicht verwenden, denn mein Content des Fenster ist zu komplex, sodass er die Breite falsch setzt. Kann er auch nicht richtig machen, er weiß ja nicht welche Breite ich haben will.

    Bluespide schrieb:

    aber die Events werden trotzdem nicht gefeuert. Anscheint übernimmt er dann nur gewisse Eigenschaften und macht trotzdem sein eigenes draus.

    Bei mir schon. Die sache ist nur die das eben wirklich auf das ResizeGrip geklickt werden muss, der Mousecursor muss also "Normal " sein. Sobald die "Pfeile" da sind klickst du ja eigentlich nicht mehr auf das ResizeGrip.

    Bluespide schrieb:

    SizeToContent kann ich leider nicht verwenden, denn mein Content des Fenster ist zu komplex, sodass er die Breite falsch setzt.

    Das kann ich irgendwie nicht glauben. Zeig mal was sich auf deinem Window wirklich tut, denn ich glaube fast das du dich hier verläufst. Ich denke schon das es hier einen besseren weg gibt, vorallem einen über Binding.

    Wenn du dich dazu entschliesst etwas mehr an Informationen preis zu geben kann ich dir bei deinem PRoblem sicher besser Helfen. Ich denke schon das es bei deinem Problem eine viel pragmatischere Lösung giben wird, kenne aber die Situation dazu viel zu wenig.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hat sich das inzwischen erledigt?
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Mhhhh, naja. Also ich habe ja ein eigenen Style für die Fenster in meiner App.xaml Datei. Wenn ich dann den ResizeMode auf ​CanResizeWithGrip stelle, dann kann ich mich nicht mehr an das ​MouseDoubleClick Event hängen, da diese nicht mehr abgefeuert wird. Wenn ich den ​ResizeMode auf ​CanResize stelle, dann kann ich das ​MouseDoubleClick verwenden, aber die grundsätzliche Funktionalität des ResizeGrips ist nicht mehr gegeben. Also das Resizen des Fensters. Ich müsste das dann in der App.xaml.cs selber anhand der Events vom ResizeGrip nachprogrammieren. Ist jetzt nicht so der Riesenaufwand, aber finde ich irgendwie etwas unschön. Für das Verschieben des Fensters z.B. kann ich einfach im Style per ​CallMethodAction an die Methode ​DragMove() weiterleiten, das ist super einfach.

    SizeToContent funktioniert nicht, da nur bestimmte Teile des Contents berücksichtigt werden müssten. Ich kann ja nicht an z.B. ein Stackpanel schreiben IgnoreAsContentSize="True"? Also er Resized halt auf den kompletten Content, das geht, aber das ist in meinem Fall nicht gewollt.

    Da dieser Punkt für mich erstmal nicht so wichtig ist, würde ich den jetzt nach hinten verschieben, aber schlussendlich muss ich dann auf ​CanResize stellen und das Resizen selbst implementieren. Ich kann leider nicht so viel Preisgeben, da es stark mit meiner Arbeit zu tun hat. Aber schon mal vielen Dank für deine Unterstützung. Es kommen noch andere WPF Fragen :P

    Bluespide schrieb:

    Wenn ich den ​ResizeMode auf ​CanResize stelle, dann kann ich das ​MouseDoubleClick verwenden, aber die grundsätzliche Funktionalität des ResizeGrips ist nicht mehr gegeben. Also das Resizen des Fensters

    Bei mri eben schon, funzt alles tedallos und die MouseEvents werden geworfen.

    Bluespide schrieb:

    Ich kann ja nicht an z.B. ein Stackpanel schreiben IgnoreAsContentSize="True"? Also er Resized halt auf den kompletten Content, das geht, aber das ist in meinem Fall nicht gewollt.

    Schau dir mal die Visibility eigenschaft an. Anders als in Winforms ist die ein enumerator mit den Werten. Visible, Hidden und Callpsed.
    Bei Collapsed ist das Control nicht sichtbar UND es wird KEIN Platz im ElemenTree reserviert. Ist also als gäbe es das control nicht. Dann sollte sizeTocontent funzen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Bei mri eben schon, funzt alles tedallos und die MouseEvents werden geworfen.
    Aber nicht mit ​WindowStyle auf ​None und ​AllowsTransparency auf ​True oder? Weil ich habe ein komplett eigenes Fensterdesign.

    Nofear23m schrieb:

    Bei Collapsed ist das Control nicht sichtbar UND es wird KEIN Platz im ElemenTree reserviert.
    Ja, ich kann die Elemente ja nicht ausblenden. Ich habe Buchungen. Manche sind Fest und manche sind Plan-Buchungen. Er soll auf die Breite der Festen Resizen, die Plan-Buchungen werden aber trotzdem weiter angezeigt. Ich kann die nicht einfach Collapsen. Oder meinst du Collapsen und dann SizeToContent und dann die die Bucungen wieder auf Visible?
    OK, das stimmt. Bei BorderStyle None nicht.

    OK, meine Idee. ResizeMode auf ResizeWithGrip um die ganze funktionalität zu haben und dann in der Ecke oder per Tastenkombi die Autosize funktion.
    Ansonsten müsstest du wirklich was eigene implementieren. Sorry

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##