WPF ResizeGrip feuert keine Events
- WPF
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
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
SaschaIf _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
- <Window x:Class="WpfApp1.MainWindow"
- 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/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:local="clr-namespace:WpfApp1"
- mc:Ignorable="d"
- Title="MainWindow" Height="200" Width="200"
- AllowsTransparency="True" WindowStyle="None" ResizeMode="CanResizeWithGrip">
- <Grid>
- <ResizeGrip x:Name="RG" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="10" Height="10" />
- </Grid>
- </Window>
Und im CS:C#-Quellcode
- public MainWindow() {
- InitializeComponent();
- this.RG.Background = Brushes.Red;
- this.RG.MouseDoubleClick += Message;
- this.RG.MouseDown += Message;
- this.RG.MouseEnter += Message;
- this.RG.MouseLeave += Message;
- this.RG.MouseLeftButtonDown += Message;
- this.RG.MouseMove += Message;
- this.RG.MouseUp += Message;
- this.RG.PreviewMouseDoubleClick += Message;
- this.RG.PreviewMouseDown += Message;
- this.RG.PreviewMouseUp += Message;
- }
- private void Message(object sender, EventArgs e) {
- MessageBox.Show("Test");
- }
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.
Das liegt daran das dein Control auch gar nicht geklickt wird/werden kann. Der Grund dafür ist das deinResizeGrip
unter einem anderenResizeGrip
liegt.
Du hast das PropertyResizeMode
des Window aufResizeWithGrip
festgelegt. Dieses bewirkt das die WPF einResizeGrip
Ü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 PropertyResizeMode
aufCanResize
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?
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
- <Window x:Class="WpfApp1.MainWindow"
- 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/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:local="clr-namespace:WpfApp1"
- mc:Ignorable="d"
- Title="MainWindow" Height="200" Width="200" Background="Transparent">
- <Window.Style>
- <Style TargetType="{x:Type Window}">
- <Setter Property="AllowsTransparency" Value="True" />
- <Setter Property="WindowStyle" Value="None" />
- <Setter Property="ResizeMode" Value="CanResizeWithGrip" />
- <Setter Property="Template">
- <Setter.Value>
- <ControlTemplate TargetType="{x:Type Window}">
- <Border x:Name="bWindowShadow" BorderThickness="1" BorderBrush="#FF000000" Background="#FF404040">
- <Border BorderBrush="#FF000000" BorderThickness="1" Background="{TemplateBinding Background}">
- <Grid>
- <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" />
- <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" />
- </Grid>
- </Border>
- </Border>
- </ControlTemplate>
- </Setter.Value>
- </Setter>
- </Style>
- </Window.Style>
- <Grid>
- </Grid>
- </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
SaschaIf _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
aufCanResizeWithGrip
stelle, dann kann ich mich nicht mehr an dasMouseDoubleClick
Event hängen, da diese nicht mehr abgefeuert wird. Wenn ich denResizeMode
aufCanResize
stelle, dann kann ich dasMouseDoubleClick
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 perCallMethodAction
an die MethodeDragMove()
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 schreibenIgnoreAsContentSize="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 aufCanResize
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 -
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
SaschaIf _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.WindowStyle
aufNone
undAllowsTransparency
aufTrue
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. -
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
SaschaIf _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. ##
-
Benutzer online 1
1 Besucher
-
Ähnliche Themen
-
Gelöschter Benutzer - - Sonstige Problemstellungen
-
Crossthreading mit einer Klasse.
Killerjo96 - - Sonstige Problemstellungen