2010-02-14 4 views
0

J'ai cherché des exemples pour cela, mais ceux que j'ai parcourus semblent se concentrer sur des choses plus simples comme la définition des DefaultDrawingAttributes d'InkCanvas telles que Largeur, Hauteur, Couleur, etc .. Il ne semble pas y avoir beaucoup de matériel ce. Par exemple, si je maintiens le bouton de la souris enfoncé, je peux voir les lignes de dessin. Que faire si je veux dessiner des ellipses au lieu de lignes, ou dessiner des ellipses autour de points échantillonnés entre le début et la fin de la ligne?Comment puis-je modifier la manière dont dessine InkCanvas?

Je sais que je peux obtenir de nouveaux points avec l'événement StrokeCollected, mais au-delà je n'ai aucune idée de l'endroit où aller. This guy semblait avoir le code de msdn, mais je ne pouvais pas le faire. Je ne sais comment construire l'interface en utilisant XAML, et il ne semble pas y avoir d'échantillon non plus.

modifier

créé une variable de classe StrokeCollection appelée thisIsNotNice, initialisé dans le constructeur et a fait cela:

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) 
{ 
    myInkCanvas.Strokes = thisIsNotNice; 

    foreach (StylusPoint p in e.Stroke.StylusPoints) 
    { 
     StylusPointCollection spc = new StylusPointCollection(); 
     spc.Add(p); 
     Stroke s = new Stroke(spc); 
     s.DrawingAttributes.Height = 3; 
     s.DrawingAttributes.Width = 3; 
     thisIsNotNice.Add(s); 
    } 
    e.Handled = true; 
} 

Mais cela ne fonctionne pas comme il se doit. Les ellipses sont dessinées, mais les lignes dessinées par la souris sont toujours là. Aussi, pour une raison quelconque, la première fois que cela fonctionne comme il se doit, en ne dessinant que les ellipses, mais ensuite il dessine à la fois les ellipses et les lignes. Mais, si je le fais à la place:

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) 
{ 
    myInkCanvas.Strokes = new System.Windows.Ink.StrokeCollection(); 
    e.Handled = true; 
} 

Les lignes ne sont pas conservées à l'écran. Donc, je ne comprends pas pourquoi ils ne sont pas effacés dans le code ci-dessus.

Si je fais ceci:

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) 
{ 
    foreach (Stroke s in myInkCanvas.Strokes) 
      System.Diagnostics.Trace.WriteLine(s); 
    e.Handled = true; 
} 

Je peux aussi voir que la toile contient les traits de ligne. Alors que l'effacement des traits après qu'ils ont été ajoutés à la collection est loin d'être idéal, il fait au moins ce que je veux. Je pourrais configurer la couleur de la ligne pour qu'elle soit la même que celle de l'arrière-plan, mais je ne serais pas capable de récupérer uniquement les ellipses. Je pourrais aussi les copier dans une collection séparée, mais c'est vraiment horrible.

Répondre

1

Il semble que vous souhaitiez personnaliser la manière dont les traits apparaissent sur votre inkCanvas. Il y a deux choses à considérer ici:

1) La façon dont ils ont l'air que l'encre coule du stylo, avant qu'il ne soit levé (le DynamicRenderer, qui fonctionne sur un autre thread pour s'assurer que l'encre est toujours rapide, est responsable Il semble que vous êtes déjà satisfait de votre solution:

2) La manière dont le trait éventuel est placé sur la toile. Pour personnaliser cela, vous pouvez essayer de sous-classer le contour, en surchargeant: protected override void DrawCore (DrawingContext drawingContext, DrawingAttributes drawingAttributes);

Chaque fois que vous obtenez un strokeCollected (et voici la même chose horrible que vous étiez inquiet mais là), vous supprimez le trait entrant du canevas et le remplacez par votre implémentation personnalisée, en volant les données de frappe du un.

Votre implémentation de DrawCore ressemblerait à quelque chose comme (pseudo-code):

foreach(sp in this.StylusPoints) 
    drawingContext.DrawEllipse(RADIUS, sp.X, sp.Y) 

Et pour ne pas obtenir les lignes qui se passent normalement vous n'appeler base.DrawCore (contexte, attributs) à tout moment.

Questions connexes