Valeurs Width et Height incorrectes aprés rotation

cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023 - 7 août 2022 à 11:40
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 17 août 2022 à 13:34

Bonjour,

En WPF, j'effectue des rotations de contrôles Image d'une longueur et largeur différentes.

J'applique à ces images des transformations de rotation. Or je m'aperçois que les propriétés Width et Height ne changent pas. Y a t il un moyen de récupérer les bonnes valeurs ?

Ex : Image de 200*100. J'effectue une rotation à 90° et les valeurs de dimensions n'ont pas bougé: 200*100 et non 100*200 comme je voudrai.

J'ai essayé avec ActualWidth et ActualHeight mais c'est pas mieux.

Merci à vous de votre aide


15 réponses

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
7 août 2022 à 11:49

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


0
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
7 août 2022 à 12:15

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é


0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
7 août 2022 à 19:31

C'est quoi le type de FlecheDg?


0
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
7 août 2022 à 19:57

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


0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
7 août 2022 à 20:23

Je t'ai dit de choisir XML pour la coloration 

Essaye de virer la valeur de Height dans le Xaml

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
7 août 2022 à 20:59

Idem. 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)


0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
7 août 2022 à 21:10

Est ce que visuellement ton image est correcte ou pas?


0
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
7 août 2022 à 21:17

Oui correcte. Verticale au départ et horizontale aprés rotation.


0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
7 août 2022 à 21:48

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.


0
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
8 août 2022 à 09:03

Merci,

Je vais donc créer et gérer d'autres propriétés de dimension qui se mettront à jour lors des transformations


0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
8 août 2022 à 10:38

Il te suffit de les calculer en fonction de l'angle de rotation 


0
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
8 août 2022 à 14:15

Oui un peu de trigo et le tour est joué

Merci


0
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
10 août 2022 à 14:47

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


0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
10 août 2022 à 19:54

C'est la même 

0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
15 août 2022 à 11:05

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:

  • Les propriétés Height et ActualHeight d'une image bindées à LaHaueteur et LaHateurActuelle
  • Une ListBox bindée à Log

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

  • faire tourner l'image pour l'un
  • (dé)zoomer pour l'autre

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")

La hauteur est de 201 pixels
Fenêtre au démarrage
Après rotation et zoom

 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é.


0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
15 août 2022 à 11:11

Une question quand même, pourquoi veut tu connaître les dimensions du rendu?

0
cs_boumboum Messages postés 34 Date d'inscription samedi 8 mars 2003 Statut Membre Dernière intervention 4 décembre 2023
17 août 2022 à 12:46

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.


0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
17 août 2022 à 13:34

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 


0
Rejoignez-nous