J'ai une toile (pas InkCanvas!) Et je suis capable d'y dessiner des polylignes. Cela fonctionne très bien, mais il y a un énorme problème avec le dessin hors limites comme indiqué dans le fichier GIF ci-dessous.UWP Dessin de toile en dehors des limites
Ma toile est dans un ScrollViewer et ScrollViewer se trouve dans un GridView.
J'ai essayé d'attraper le pointeur en laissant la toile avec les gestionnaires d'événements suivants:
canvas.PointerExited += Canvas_PointerExited;
canvas.PointerCaptureLost += Canvas_PointerCaptureLost;
Mais il semble que ces événements sont déclenchés trop lent.
J'ai essayé d'utiliser la propriété Clip de ma toile, mais il n'y a aucun changement de comportement. Et il n'y a pas de propriété "ClipToBound" pour le canevas UWP.
Toute ma vue est générée dans Code-Behind parce que je dois générer plusieurs canevas sur une seule vue.
Y at-il un moyen d'arrêter ce comportement?
EDIT1:
Comme demandé: plus de perspicacité de mon code.
Le XAML page ressemble à ceci:
<Grid x:Name="BoundingGrid">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="15*"/>
</Grid.RowDefinitions>
<Grid x:Name="InkGrid" VerticalAlignment="Top" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" />
<Grid x:Name="CanvasGrid" Grid.Row="1" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" VerticalAlignment="Top"/>
</Grid>
Il est tout à l'intérieur d'une page.
Mon code ressemble derrière comme ceci:
Mes constructeurs:
public ImprovedCanvasManager(Grid boundingGrid, Grid overviewGrid, string filepath, double height)
{
drawCanvas = new Canvas();
overviewGrid.Loaded += OverviewGrid_Loaded;
overviewGrid.SizeChanged += OverviewGrid_SizeChanged;
RowDefinition rd = new RowDefinition();
rd.Height = new GridLength(height);
overviewGrid.RowDefinitions.Add(rd);
InitializeScrollViewer();
Grid.SetRow(scroll, overviewGrid.RowDefinitions.Count);
Grid.SetColumn(scroll, 0);
scroll.Content = drawCanvas;
overviewGrid.Children.Add(scroll);
LoadImage(filepath);
}
public ImprovedCanvasManager(Grid boundingGrid, Grid overviewGrid, Grid inkToolGrid, string filepath, double height = 1000) : this(boundingGrid, overviewGrid, filepath, height)
{
AddDrawingToolsToCanvas(inkToolGrid, overviewGrid);
EnableDrawingOnCanvas(drawCanvas);
}
Je ne me suis fait deux contructeurs pour le rendre simple pour moi de instancier toiles avec la possibilité de dessiner et sans la capacité de dessiner .
Voilà comment j'INITIALISER mon ScrollViewer:
private void InitializeScrollViewer()
{
scroll = new ScrollViewer();
scroll.VerticalAlignment = VerticalAlignment.Top;
scroll.VerticalScrollMode = ScrollMode.Auto;
scroll.HorizontalScrollMode = ScrollMode.Auto;
scroll.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
scroll.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
scroll.ZoomMode = ZoomMode.Enabled;
scroll.ManipulationMode = ManipulationModes.All;
scroll.MinZoomFactor = 1;
scroll.MaxZoomFactor = 3;
}
Ce sont les seules lignes de code qui affectent toute viewbuilding.
Edit 2:
Ma toile ne remplit pas la grille entourant à gauche, mais sur le fond.
Une réponse rapide à ce qui précède, les définitions de ligne avec des étoiles sont censées être des pourcentages. Donc '15 *' est égal à '1500%'.Lorsque vous utilisez des étoiles, je recommande fortement que toutes les valeurs totalisent un. ' ' et < ' –
Laith
Où la polyligne est-elle ajoutée? Comment ça se passe-t-il? – Laith
Merci pour cette réponse. Et j'ai découvert que votre code fonctionne parfaitement. Mais ma toile n'est pas assez large pour remplir la grille environnante. Ainsi, votre code coupe parfaitement la ligne sur les bords supérieur et inférieur, mais pas sur les côtés gauche et droit. Je poste une capture d'écran dans ma queston. – eXodiquas