[VB.net WPF] manipulation entre 2 fenêtres

Résolu
cs_Finalso Messages postés 7 Date d'inscription samedi 27 février 2010 Statut Membre Dernière intervention 2 juin 2015 - 31 oct. 2013 à 15:56
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 1 nov. 2013 à 15:42
Bonjour tout le monde,
c'est la première fois que je poste un message, soyez clément s'il vous plaît.
D'habitude je me débrouille pour trouver une réponse sur le net mais là, j'avoue que je bloque et j'ai besoin de vous.
Dans un projet,
j'ai 2 fenêtres : windows1 (avec TextBox1 et Button1) et windows2 (avec TextBox2 et Button2)

lors d'un click sur Button1 j'ouvre windows2 (jusque là, pas de problème).

Ce que je souhaite faire, c'est que quand windows2 s'ouvre, TextBox1 passe en ReadOnly = true (pas de problème).
Ensuite avec Button2, j'envoie windows2.TextBox2.text vers windows1.TextBox1.text .
Et pour finir, quand windows2 se ferme, windows1.TextBox1 doit passer en ReadOnly = false.

Code fenêtre 1 XAML:
    
<Grid>
<Button x:Name="Button1" Content="Button1" HorizontalAlignment="Left" Margin="10,38,0,0" VerticalAlignment="Top" Width="120"/>
<TextBox x:Name="TextBox1" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
</Grid>


Code fenêtre 1 :
Class MainWindow

Sub New()
InitializeComponent()
End Sub

Dim wndw_2ndFenetre As Window2 = New Window2

Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click
TextBox1.IsReadOnly = True
wndw_2ndFenetre.Show()
AddHandler wndw_2ndFenetre.MyEventTransfert, AddressOf TransfertText
AddHandler wndw_2ndFenetre.MyEventTextBox1_IsReadOnly_False, AddressOf TextBox1_IsReadOnly_False

End Sub

Sub TransfertText()
TextBox1.Text = wndw_2ndFenetre.TextBox2.Text
End Sub

Sub TextBox1_IsReadOnly_False()
TextBox1.IsReadOnly = False
End Sub

End Class


Code fenêtre 2 XAML:
<Grid>
<Button x:Name="Button2" Content="Button2" HorizontalAlignment="Left" Margin="10,38,0,0" VerticalAlignment="Top" Width="120"/>
<TextBox x:Name="TextBox2" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
</Grid>


Code fenêtre 2 :
Public Class Window2

Sub New()
InitializeComponent()
End Sub

Public Event MyEventTransfert(ByVal sender As Window2, ByVal e As System.EventArgs)
Public Event MyEventTextBox1_IsReadOnly_False(ByVal sender As Window2, ByVal e As System.EventArgs)

Private Sub Button2_Click(sender As Object, e As RoutedEventArgs) Handles Button2.Click
RaiseEvent MyEventTransfert(Me, New RoutedEventArgs())
End Sub

Private Sub Window_Closed(sender As Object, e As EventArgs)
RaiseEvent MyEventTextBox1_IsReadOnly_False(Me, New RoutedEventArgs())
End Sub
End Class



Ce code fonctionne mais si j'active le "Option Strict On" j'obtients une erreur
Dans windows1 juste après les "AddressOf" :
La méthode 'Public Sub TextBox1_IsReadOnly_False()' n'a pas une signature compatible avec le délégué 'Delegate Sub MyEventTextBox1_IsReadOnly_FalseEventHandler(sender As Window2, e As System.EventArgs)'.

J'ai trouvé pas mal de truc sur les "delegate" avec EventArgs et EventHandler,
mais je ne métrise pas du tout ça, je suis un peu dans le nuage.

Que me manque-t-il pour pouvoir activer "Option Strict On" sans erreur?

Merci.

Ps : Ne me dites pas de mettre "Option Strict Off" s'il vous plaît.

4 réponses

Salut,

Si e est un EventArgs dans l'événement click de ton bouton, alors le délégué appelé ou l'événement déclenché correspondants doivent tous reprendre un argument du même type. Je corrige le premier de tes deux cas :

Public Event MyEventTransfert(ByVal sender As Window2, ByVal e As System.EventArgs)


 AddHandler wndw_2ndFenetre.MyEventTransfert, AddressOf TransfertText


Sub TransfertText(byval sender as windows2,byval e as System.EventArgs)
TextBox1.Text = wndw_2ndFenetre.TextBox2.Text
End Sub


RaiseEvent MyEventTransfert(Me, new system.eventargs)
2
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 2
Modifié par lermite222 le 31/10/2013 à 19:30
Bonjour,
Y a-t-il un raison particulière pour que tu code en WPF alors que quelque lignes suffise en VB.NET ?
A+
Edit: En y réfléchissant un peu, je pense qu'il y a un problème au niveau des liaisons tardives, il y a toujours une erreur mais avec le stric ON elle apparaît.
essaye voir... stric OFF
Tu ferme Windows2..tu n'a pas d'erreur mais le texte de W2 ne va pas sur W1.
Tu peu contourner cela en implémentant l'événement FormClosing qui se produit avant le Disposed

Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
1
cs_Finalso Messages postés 7 Date d'inscription samedi 27 février 2010 Statut Membre Dernière intervention 2 juin 2015
Modifié par cs_Finalso le 1/11/2013 à 12:12
Merci Banana32 pour la correction, ça marche nikel.
Du coup je vois beaucoup plus clair en ce qui concerne les évènements et RaiseEvent.

Merci lermite222, pour répondre à tes questions/suggestions :
C'est un logiciel que je remet au gout du jour en wpf, initialement il était en window Form.
il y a pas mal de site internet qui disent que le WPF est l'avenir par rapport au window Form.

Effectivement, un autre problème apparaît, si je ferme Window2, je ne peux plus la ré-ouvrir.l'érreur retournée est :
"L'exceptions InvalidOperationException n'a pas était géré.
Impossible de définir Visibility ou d'appeler Show, ShowDialog ou WindowInteropHelper.EnsureHandle après la fermeture d'un objet Window."

j'ai trouvé ça sur msdn :
http://msdn.microsoft.com/fr-fr/library/ms748948%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-9
(Durée de vie d'une fenêtre).

Dans une des remarques :
Une fenêtre ne peut pas être rouverte après sa fermeture.

Du coup j'ai feinté, dans le "closing" de la Window2 :
    Private Sub Window_Closing(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
e.Cancel = True
Me.Visibility = Windows.Visibility.Hidden
RaiseEvent MyEventTextBox1_IsReadOnly_False(Me, New System.EventArgs)
End Sub

J'annule la fermeture et je la fais disparaitre (invisible).

Je vais me contenter de cette méthode vu quelle fonctionne.

Il ne faut pas oublier de mettre le mode d'arrêt de l'application à : lors de la fermeture de la fenêtre pricipale

un GRAND MERCI.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 2
Modifié par lermite222 le 1/11/2013 à 15:45
Tant mieux si tu a trouvé une solution, toutefois je pense que si tu avais simplement mis
Private Sub Window_Closing(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
Windows1.textBox1.Text = Me.TextBox1.text
End Sub

Tu pourrais laisser W2 se fermer et tu pourrais la ré-ouvrir.
Note, j'ai pas testé.
Toujours gênant de laisser en arrière-plan un truc dont ont n'aura peut-être plus besoin.
A+
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
0
Rejoignez-nous