Bonjour,
J'ai un programme contenant une image venant d'une camera, donc mise à jour automatiquement chaque x temps (le temps dépend du modèle de camera). Pour afficher l'image de cette camera j'ai doonc une Grid (CameraGrid) qui va elle contenir un élément visuel pour afficher seulement une partie de l'image (CameraView). Au même niveau de la CameraGrid j'ai une autre Grid qui est au dessus de l'image pour pouvoir afficher des layers par dessus cette image. Il est possible de faire des mesures sur ce layer. J'ai commencé à ajouter un Magnifier sur ce layer. Voici mon WPF:
Depuis le WPF je n'ai pas forcément accès à la caméra grid. De plus le DataContext de mon Magnifier n'a pas implicitement conaissance de la camera Grid. Voilà ici comment je travail avec les différents binding:
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 <Canvas HorizontalAlignment="Left" VerticalAlignment="Top" Visibility="{Binding MagnifierViewBox, Converter={concept:NullableToVisibilityConverter}}"> <Canvas Canvas.Left="{Binding MagnifierLeftPosition}" Canvas.Top="{Binding MagnifierTopPosition}" IsHitTestVisible="False" Visibility="{Binding IsMagnifierVisible, Converter={concept:BoolToVisibilityConverter}}"> <Ellipse Width="250" Height="250" Fill="White" /> <Ellipse Width="{Binding MagnifierSize}" Height="{Binding MagnifierSize}" Name="magnifierEllipse" StrokeThickness="3" Fill="{Binding MagnifierContent}"> <Ellipse.Stroke> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="#AAA" /> <GradientStop Offset="1" Color="#111" /> </LinearGradientBrush> </Ellipse.Stroke> </Ellipse> </Canvas> </Canvas>
Comme vous pouvez le deviner, la ClickPosition est la position de la souris. L'elipse suit correctement la souris. La seule chose qui ne fonctionne pas (la plus importante) c'est que je n'ai pas l'élément visuel afficher (la propriété Visual de MagnifierContent).
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 private void MoveMagnifier() { Rect viewBox; //Récuperer la camera grid. Fonctionne correctement var view = VisionSystemUtils.VisionSystemWindows.First(x => x.CameraView != null); if (MagnifierContent == null) { MagnifierContent = new VisualBrush() { ViewboxUnits = BrushMappingMode.Absolute, Viewbox = new Rect(0, 0, 50, 50), ViewportUnits = BrushMappingMode.RelativeToBoundingBox, Viewport = new Rect(0, 0, 1, 1), //Mettre le contenu de la camera grid dans l'elipse. Visual = (view.CameraView.Content as UIElement) }; viewBox = MagnifierContent.Viewbox; viewBox.Width = MagnificationForMagnifier; viewBox.Height = MagnificationForMagnifier; MagnifierContent.Viewbox = viewBox; return; } viewBox = MagnifierContent.Viewbox; //Calcul de l'affichage en suivant la position de la souris var xOffset = viewBox.Width / 2.0; var yOffset = viewBox.Height / 2.0; viewBox.X = ClickPosition.X - xOffset; viewBox.Y = ClickPosition.Y - yOffset; MagnifierContent.Viewbox = viewBox; MagnifierLeftPosition = ClickPosition.X - MagnifierSize / 2; MagnifierTopPosition = ClickPosition.Y - MagnifierSize / 2; //Ce code semble inutile DoPropertyChanged(nameof(MagnifierContent)); DoPropertyChanged(nameof(MagnifierContent.Viewbox)); DoPropertyChanged(nameof(MagnifierContent.Visual)); }
https://social.msdn.microsoft.com/Fo...wpf-?forum=wpf
J'ai utilisé ce thread pour faire mon Magnifier mais je ne sais pas si j'ai loupé quelque chose lors de l'adaptation avec les bindings. J'ai cherché d'autres thread sur l'erreur du Visual qui ne s'update pas sans succès.
Peut-être que ma logique n'est pas bonne aussi, n'hésitez pas si vous avez des questions ou conseil.
Merci de m'avoir lu.
Partager