Bonjour
dans ma boule de cristal, je vois qu'il manque un pinte à la ligne 1664.
Sinon pour une réponse sérieuse, il faut poster le ou les codes que tu as utilisé pour faire la rotation et afficher l'image.
Voir ici, https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code
Mettre Basic pour le code behind et Xml pour le Xaml
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Pour l'instant je cherche et j'essaie avec un petit bout de code.
J'ai une image FlecheDG qui fait 100*53
2 labels pour m'afficher les valeurs de Width et Height
Dim Rotation As New RotateTransform(90) FlecheDg.RenderTransform = Rotation lbl1.Content = FlecheDg.Height lbl2.Content = FlecheDg.Width
J'execute ce code et les valeurs Width et Height n'ont pas bougé
C'est quoi le type de FlecheDg?
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
C'est un type Image
<Canvas x:Name="FeuilleDessin" Height="3000" Width="2000" Margin="2,2,2,2" Background="#FF8E8CAD"> <Image x:Name="FlecheDg" Height="100" Canvas.Left="124" Canvas.Top="62" Width="53" Source="/VoitureBleue_HB.fw.png"/> </Canvas>
J'essaie les propriétés actualWidth et ActualHeight : Idem. RenderSize : Idem.
J'ai l'impression que les valeurs Width et Height ne sont pas liés au repére du Canvas parent et qu'il va falloir que je crée mes propres propriétés
Je t'ai dit de choisir XML pour la coloration
Essaye de virer la valeur de Height dans le Xaml
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionIdem. j'ai supprimé le height
A l'origine, l'image fait 53*100. Maintenant Mes labels m'indiquent pour Width :53 et Height :NaN.
Aprés rotation : les valeurs bougent pas mais mon image a bien pivoté.
En lançant le debuggage, et en parcourant les différentes propriétés de l'image cà ne m'éclaire en rien.
Trop bizarre ou alors je passe à côté de qq chose.
<Canvas x:Name="FeuilleDessin" Height="3000" Width="2000" Margin="2,2,2,2" Background="#FF8E8CAD"> <Image x:Name="FlecheDg" Canvas.Left="124" Canvas.Top="62" Width="53" Source="/VoitureBleue_HB.fw.png"/> <Button x:Name="bp1" Content="Button" Canvas.Left="392" Canvas.Top="33"/> <Label x:Name="lbl1" Content="Label" Height="26" Canvas.Left="309" Canvas.Top="162" Width="103"/> <Label x:Name="lbl2" Content="Label" Canvas.Left="309" Canvas.Top="131" RenderTransformOrigin="0.691,-3.016"/> <Button x:Name="bp2" Content="Button" Height="18" Canvas.Left="399" Canvas.Top="73" Width="33"/> </Canvas>
Class MainWindow Private Sub dbclick(sender As Object, e As MouseButtonEventArgs) Handles bp1.Click lbl1.Content = FlecheDg.Height lbl2.Content = FlecheDg.Width Dim Rotation As New RotateTransform(90) FlecheDg.RenderTransform = Rotation End Sub Private Sub bp2_Click(sender As Object, e As RoutedEventArgs) Handles bp2.Click lbl1.Content = FlecheDg.Height lbl2.Content = FlecheDg.Width End Sub End Class
Je t'ai mis le code complet . Le BP1 affiche les valeurs de départ et effectue la rotation. Le BP2 affiche les valeurs aprés la rotation. Dans mon cas toujours Width=53 et Height=NaN (depuis que j'ai supprimé Height dans le XAML)
Est ce que visuellement ton image est correcte ou pas?
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Oui correcte. Verticale au départ et horizontale aprés rotation.
C'est parce que c'est le rendu visuel du contrôle qui est tourné, donc ses dimensions d'origine n'ont pas changées.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Merci,
Je vais donc créer et gérer d'autres propriétés de dimension qui se mettront à jour lors des transformations
Il te suffit de les calculer en fonction de l'angle de rotation
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Oui un peu de trigo et le tour est joué
Merci
Bonjour,
Idem pour les propriétés Left et Top d'un élément dans un Canvas sous WPF.
Je m'explique:
Je dispose par exemple sur un canvas un Button de forme rectangulaire. Les propriétés Top et Left de ce Button ont des valeurs.
J'effectue dans l'éditeur Design de VS une rotation à 90 degrés de ce Button, les coordonnées ne changent pas. Alors qu'elles devraient être diiférentes.
Si quelqu'un a une explication et une solution, je suis preneur.
Merci d'avance
C'est la même
Bonjour
étant rentré chez moi, j'ai trouvé un peu de temps pour te faire une sorte d'exemple, avec VS 2019 en Framework .Net 4.8.
D'abord j'ai écrit une classe dont le rôle est de logguer les changement de Height et ActualHeight (Width se comporte pareil, donc pour l'exemple je n'en ai fait qu'un)
Class ExempleBoumboum Inherits INotifyPropertyChanged Public Event PropertyChanged As PropertyChangedEventHandler Private Sub GenerePropertyChanged(ByVal Propriete As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Propriete)) End Sub Private laHauteur As Double ''' <summary> ''' Valeur de Height ''' </summary> Public Property Hauteur As Double Get Return laHauteur End Get Set(ByVal value As Double) If laHauteur <> value Then laHauteur = value GenerePropertyChanged("Hauteur") Log.Add($"Height : {laHauteur} à {DateTime.Now}") End If End Set End Property Private laHauteurActuelle As Double ''' <summary> ''' Valeur de ActualHeight ''' </summary> Public WriteOnly Property HauteurActuelle As Double Set(ByVal value As Double) If laHauteurActuelle <> value Then laHauteurActuelle = value GenerePropertyChanged("HauteurActuelle") Log.Add($"ActualHeight : {laHauteurActuelle} à {DateTime.Now}") End If End Set End Property ''' <summary> ''' Collection logguant les datas ''' </summary> Public Property Log As ObservableCollection(Of String) = New ObservableCollection(Of String)() End Class
Mon idée première était de binder une instance de cette classe à ma fenêtre:
Mais ActualHeight n'est pas prévue pour être bindée facilement, et donc l'exemple aurait compliqué juste pour ça.
Je ne voulais pas te noyer dans un behavior inutile, j'ai donc utilisé l'évenement SizeChanged.
Sur la fenêtre, il y a donc une image, Height est bindée, ActualHeight ne l'est pas.
Il y a 2 sliders qui permettent (par binding toujours) de
Et une listbox est bindée sur Log.
<Window x:Class="Tests.MainWindow" <--Ici il faut laisser toutes les lignes par défaut, les seules valeurs à vérifier sont la hauteur et la largeur de la fenêtre, en outre il faut préciser que le DataContext proviendra du Binding, voir ligne ci dessous--> Height="600" Width="800" DataContext="{Binding}"> <Grid DataContext="{Binding .}"> <Canvas Margin="100,35,0, 100" HorizontalAlignment="Left" DataContext="{Binding .}"> <Image Source="C:\Users\3A\Pictures\WismerhillSmall.jpg" Canvas.Top="10" Canvas.Left="10" Height="{Binding Hauteur, Mode=OneWayToSource}" SizeChanged="Image_SizeChanged"> <Image.RenderTransform> <TransformGroup> <RotateTransform Angle="{Binding ElementName=sldRotation, Path=Value}"/> <ScaleTransform ScaleX="{Binding ElementName=sldZoom, Path=Value}" ScaleY="{Binding ElementName=sldZoom, Path=Value}"/> </TransformGroup> </Image.RenderTransform> </Image> </Canvas> <TextBlock Text="Rotation" Margin="30, 0" HorizontalAlignment="Left"/> <Slider Name="sldRotation" Minimum="0" Maximum="90" Margin="5, 10" HorizontalAlignment="Left" Width="100"/> <TextBlock Text="Zoom" Margin="230, 0" HorizontalAlignment="Left"/> <Slider Name="sldZoom" Minimum="0.5" Maximum="2" Value="1" Margin="205, 10" HorizontalAlignment="Left" Width="100"/> <ListBox ItemsSource="{Binding Log}" Margin="10, 355,10,10"/> </Grid> </Window>
Et le code behind de cette fenêtre est
Private exemple As ExempleBoumboum Public Sub New() InitializeComponent() exemple = New ExempleBoumboum() Me.DataContext = exemple 'on binde la fenêtre à une instance de ExempleBoumboum, je dois "garder" l'instance, pour la gestion de Image_SizeChanged. End Sub Private Sub Image_SizeChanged(ByVal sender As Object, ByVal e As SizeChangedEventArgs) exemple.HauteurActuelle = (TryCast(sender, Image)).ActualHeight End Sub
Voici les propriétés du jpg (note je n'utilise pas le mot "image" pour ne pas mettre de confusion avec le contrôle "Image")
Comme tu peux le constater Height vaut NAN, parce que Height prends la valeur d'initialisation que le codeur lui impose dans le XAML et je ne l'ai pas fait.
Et puisque pour ce test, c'est bindé, que le binding arrive après le InitializeCompomnent (forécement, il faut que les contrôles existent pour les binder...) Height restera à NAN.
ActualHeight quand à lui prend la valeur 201, qui est la hauteur de mon jpg.
Ces 2 valeurs ne varient pas en cas de rotation et ou de zoom car ce n'est que le rendu du contrôle qui change.
PS 1 Beaucoup de codeurs qui ont commencé par VBA ou VB6 n'ont pas su passer de la programmation vaguement orientée objet à la programmation "tout" objet quand ils ont "basculés" vers .Net Winform. Si c'est ton cas et que tu n'es pas déjà à l'aise avec la programmation "tout" objet, WPF va être très compliqué.
PS 2, si tu es déjà à l'aise avec la programmation "tout" objet mais que tu n'as pas abordé ou compris le binding en Winform, WPF va être compliqué.
PS 3 si tu es déjà à l'aise avec le binding mais que tu n'as pas abordé ou compris le pattern MVC (voir MVVM mais en winform, je ne crois pas que ce soit réalisable) en Winform, WPF va être un peu compliqué.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Une question quand même, pourquoi veut tu connaître les dimensions du rendu?
Bonjour ,
L'inrerface utilisateur de mon appli permet de déposer par glisser déposer différents modules (des modules pour des manutentions industrielles (table pivotante, translateur, convoyeur, etc...) Chacun de ces modules est une classe différente. Je peux effectuer une rotation de ces modules pour les disposer verticalement ou horizontalement. Aprés avoir dessiné mon schéma, la compilation de celui-ci permet de les relier entre eux. Ceci est fait automatiquement par l"appli qui se base sur le positionnement des modules entre eux.
Je dois donc connaitre les dimensions correctes . Par exemple un convoyeur peut avoir une longueur variable. Si je fais une rotation, ses dimensions doivent changer sinon le compilation ne vas pas bien se passer.
Je ne sais pas si je suis clair. Mais si çà t'interesse je peux te montrer une petite vidéo de l'appli en winform et fonctionnelle. Tu comprendras.
En tout cas un grand merci d'avoir passé du temps pour ces explications que j'étudierai attentivement à mon retour. Pour l'instant, je ne peux pas en faire plus car pas chez moi.
Bonjour
à mon avis tu n'as pas besoin de connaître la taille après rotation, il devrait suffire de jouer avec les marges.
J'ai besoin d'un peu de temps pour y réfléchir et te faire un autre exemple
Quand j'étais petit, la mer Morte n'était que malade.
George Burns