IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual Studio Discussion :

WPF VisualBasic : modifier un Label par code.


Sujet :

Visual Studio

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 6
    Points
    6
    Par défaut WPF VisualBasic : modifier un Label par code.
    Bonjour,

    J'essaye de programmer en WPF avec VB. (V S 2013)

    Mon problème est le suivant :
    Si je modifie les caractéristiques (position par exemple) d'un Label à la souris, dans les propriétés du Label ou dans le code WPF, pas de problème, j'obtiens bien ce que je désire.

    Là où ça se complique c'est quand je veux le faire dans le code Visual Basic !
    En l’occurrence je veux déplacer un Label automatiquement, pour qu'il suive l'objet qu'il désigne.
    L'objet, lui (une Line) se déplaçant déjà en fonction d'une formule.

    Premier problème, je ne trouve nulle part la syntaxe en VB des instructions qui me permettraient de lier la position du Label en fonction de la position de Line .
    Par exemple Label.Margin = (X1,X2,Y1,Y2)
    J'ai essayé les parenthèses les guillemets, les deux : erreur de syntaxe à la saisie + 'System.Reflection.TargetInvocationException' s'est produite dans PresentationFramework.dll Informations supplémentaires*: Une exception a été levée par la cible d'un appel." à chaque fois à l'exécution.
    Même l'instruction : "Label.Height = Valeur" qui elle ne génère pas d'erreur de syntaxe à la saisie (souligné ondulé) me donne le même message à l'exécution .

    Bon, je commence à être habitué à ce genre de message à chaque vois que je me trompe quelque part, mais cela ne m'indique pas dans quelle direction je dois chercher.

    Je fais donc appel à votre savante assemblée.

    Si vous avez une idée ou un tutoriel auquel me référer (je n'ai rien trouvé sur le sujet) je vous en serais reconnaissant.

    Amitiés.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 185
    Points : 173
    Points
    173
    Par défaut
    Bonjour,

    As tu essayé d'utiliser la propriété location de ton label ?

    Par exemple,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim pnt as new point(X,Y) ' Avec X qui prend la valeur 300, par exemple, et Y la valeur 30'
     
    monLabel.location = pnt ' Positionne monLabel aux coordonnées 300;30.'
    Si je complète mon idée, je peux également faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DIM ptX as integer
    Dim ptY as integer
    Dim pnt as new point(ptX, ptY)
     
    ' affectation de la valeur de X'
    pnt.X = 300
    ' affectation de la valeur de Y'
    pnt.Y = 30
     
    monLabel.location = pnt


    Bon après-midi.

    Geache

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Le positionnment des controls est fait d'une maniere automatique mais malheureusent tout est en coordonnees relatives par rapport au container en cours...ce qui en fait un systeme recursif(fameux Layout pass)...

    La liaison des positions UI par binding n'est donc pas aussi facile et necessite de gerer levent LayoutUpdate pour modifier et influencer les coords de disposition qui ont ete calculees dans la passe de disposition....
    Le Margin de wpf a pour valeur un Thicness en WPF....
    Aussi je te suggere un UserControl avec ton Line .
    Le user control sera dote d'un Dependency Property PointThickness:
    -qui sera maj en fonction de line.x1,line.Y1 dans usercontrol_layoutupdated
    -ton label sera bindee à celle -ci
    -on utilise (ln.x2-ln.x1) pour center position label
    -les margins Right et Bottom du Line sont controlees par celles du Line( ActualWidth et ActualHeight du Line sont versatiles car ils dependent du mode Stretch de Line ....!!!)...

    Par ailleurs ton label aura sa prop HorizontalAlignement à Left et idem pour VerticalAlignement(car ils controlent les marges par defaut qui valent Center)...

    bref voici l'exemple de code:

    code xaml usercontrol :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    <UserControl x:Class="UserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
     
        <Grid
            x:Name="grd"
            PreviewMouseLeftButtonDown="Grid_PreviewMouseLeftButtonDown"
            PreviewMouseMove="Grid_PreviewMouseMove"
            PreviewMouseRightButtonDown="Grid_PreviewMouseRightButtonDown">
            <Line
                x:Name="ln"
                Stroke="Red"  
                StrokeThickness="3.0"
                X1 ="50" Y1="50" 
                X2="100" Y2="100"
                />
        </Grid>
    </UserControl>
    code behind .vb du usercontrol:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Public Class UserControl1
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            PointThickness = New Thickness(ln.X1 + (ln.X2 - ln.X1) / 2,
                                           ln.Y1 + (ln.Y2 - ln.Y2) / 2,
                                           ln.Margin.Right,
                                           ln.Margin.Bottom)
        End Sub
     
     
        Public Property PointThickness As Thickness
            Get
                Return GetValue(PointThicknessProperty)
            End Get
     
            Set(ByVal value As Thickness)
                SetValue(PointThicknessProperty, value)
            End Set
        End Property
     
        Public Shared ReadOnly PointThicknessProperty As DependencyProperty = _
                               DependencyProperty.Register("PointThickness", _
                               GetType(Thickness),
                               GetType(UserControl1), _
                               New FrameworkPropertyMetadata(Nothing))
        Private Sub UserControl1_LayoutUpdated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LayoutUpdated
            PointThickness = New Thickness(ln.X1 + (ln.X2 - ln.X1) / 2,
                                           ln.Y1 + (ln.Y2 - ln.Y2) / 2,
                                           ln.Margin.Right,
                                           ln.Margin.Bottom)
        End Sub
        Private ptDown As Point
        Private isDown As Boolean
        Private Sub Grid_PreviewMouseLeftButtonDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
            If e.LeftButton = MouseButtonState.Pressed Then
                ptDown = e.GetPosition(Me.grd)
                isDown = True
                Me.grd.CaptureMouse()
            End If
        End Sub
     
        Private Sub Grid_PreviewMouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseEventArgs)
            If isDown And e.LeftButton = MouseButtonState.Pressed Then
                Dim pt As Point = e.GetPosition(Me.grd)
                ln.X1 += pt.X - ptDown.X
                ln.Y1 += pt.Y - ptDown.Y
                ln.X2 += pt.X - ptDown.X
                ln.Y2 += pt.Y - ptDown.Y
                ptDown = pt
            End If
        End Sub
     
        Private Sub Grid_PreviewMouseRightButtonDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
            If e.RightButton = MouseButtonState.Pressed Then
                isDown = False
                ptDown = New Point
                Me.grd.ReleaseMouseCapture()
            End If
        End Sub
    End Class
    code xaml du form utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
     
     
     
     
     
    <Window x:Class="Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfBindingPositionLabelTo" 
        Title="Window1" Height="350" Width="525">
        <StackPanel >
            <!--exemple sur un grid-->
            <Grid  
                Background="LightGray" 
                Height="300"
                ClipToBounds="True">
                <Label 
                    HorizontalAlignment="Left"
                    VerticalAlignment="Top" 
                    Content="Line1"
                    Background="BlueViolet" 
                    Opacity="0.6"
                    Margin="{Binding ElementName=ctrl,Path=PointThickness}">
                </Label>
                <local:UserControl1 
                    x:Name="ctrl">
                </local:UserControl1>
     
            </Grid>
            <!--exemple sur un canvas-->
            <Canvas
                Background="LightYellow"  
                Height="300"
                ClipToBounds="True">
                <local:UserControl1 
                    x:Name="ctrl2">
                </local:UserControl1>
                <Label 
                    HorizontalAlignment="Left"
                    VerticalAlignment="Top" 
                    Content="Line2"
                    Background="NavajoWhite"  
                    Opacity="0.6"
                    Margin="{Binding ElementName=ctrl2,Path=PointThickness}">
                </Label>
            </Canvas>
        </StackPanel>
    </Window>
    bon code....

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Bonjour et merci à vous deux,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Class MainWindow 
        Dim ptX As Integer
        Dim ptY As Integer
        Dim pnt As New Point(ptX, ptY)
    
        ' affectation de la valeur de X'
    pnt.ptX = 300
        ' affectation de la valeur de Y'
    pnt.ptY = 30
    
    monLabel.location = pnt
    
    End Class
    Je sais que je suis nul, j'ai trois fois déclaration attendue(monLabel et pnt) , que faire.
    Bien sûr j'ai appelé mon Label : monLabel.
    Où est l'erreur?

    Pour la réponse de MABROUKI, désolé, mis je n'ai pas encore (l'aurais-je un jour ?) ce niveau.

    Merci pour vos réponses.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 185
    Points : 173
    Points
    173
    Par défaut
    Bonjour,

    Tu ne dois pas affecter pnt.ptx = 300 et pnt.pty = 30
    Mais bien ptx = 300 et pty = 30.

    Je pense que l'erreur est à ce niveau.

    Bonne journée.

    Geache.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci geache pour ta réponse.
    J'ai fait la modification, mais le résultat est le même.
    Trois erreurs : Déclarations attendues


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      Dim ptX As Integer
        Dim ptY As Integer
        Dim pnt As New Point(ptX, ptY)
    
        ' affectation de la valeur de X'
    ptX = 300
        ' affectation de la valeur de Y'
    ptY = 30
     monLabel.location = pnt
    J'ai en outre cet avertissement :

    Visual studio ne peut pas lancer le débogage , car la cible du débogage , " C: visual studio 2013/projects/Label-1/Label-1/bin/debug/Label-1.exe" est manquante.
    Générez le projet et reéssayez, ou définissez les propriétés OutputPath et AssemblyName en conséquence pour qu'ils pointent vers l'emplacement correct de l' assembly cible.
    Bien sûr si je remplace dans le Dim ptX et ptY par deux valeurs, cela me fait deux erreurs de moins, mais cela ne me résoudra pas le problème.

    Désolé d'être aussi inexpérimenté mais je ne m'en sors pas.

    Cordialement.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Bonjour à tous,

    Tête en l'air, j'ai commis des erreurs inexcusables.
    Les deux déclarations n'étaient pas dans une procédure Sub,

    Par contre, il semblerait qu'en VB et WPF, la propriété location n'existe pas .
    "location n'est pas un membre de System.Windows.Controls.Label"
    J'ai essayé avec margin, mais je ne connais pas la syntaxe et j'ai trouvé une propriété "OnLocationChanged" mais je ne sais pas trop non plus quelle est son rôle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Class MainWindow
    
        Dim ptX As Integer
        Dim ptY As Integer
        Dim pnt As New Point(ptX, ptY)
    
    
    
        Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
            ' affectation de la valeur de X'
            ptX = 300
            ' affectation de la valeur de Y'
            ptY = 30
    
            monLabel1.location = pnt
    
        End Sub
    End Class
    si vous avez une idée..

    Merci par avance.

Discussions similaires

  1. [OL-2007] Modifier une option par code
    Par jphcrutzen dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 22/11/2010, 15h18
  2. Modifier master page par code
    Par lightbulb dans le forum SharePoint
    Réponses: 2
    Dernier message: 23/02/2009, 14h36
  3. [2.0] Créer des types & modifier leur définition par code
    Par FRED.G dans le forum Framework .NET
    Réponses: 6
    Dernier message: 12/11/2006, 17h49
  4. [C#] Créer un label par code
    Par djoao dans le forum Windows Forms
    Réponses: 7
    Dernier message: 31/03/2006, 09h10
  5. Réponses: 4
    Dernier message: 21/02/2006, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo