Voici un simple SSCCE.
Éditer: Ce n'est peut-être pas exactement ce que vous vouliez, maintenant relire la question, mais peut-être que cela peut vous donner une idée de la façon de structurer vos outils de remplissage. En ce qui concerne la perfection des pixels, même MS Paint nécessite un dessin fermé complet, où d'autres bibliothèques pourraient utiliser des degrés d'antialias correspondant pour éviter les "fuites".
XAML:
<Window x:Class="FreeformDrawing.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
MouseLeftButtonDown="Window_MouseLeftButtonDown"
MouseLeftButtonUp="Window_MouseLeftButtonUp"
MouseMove="Window_MouseMove"
Title="MainWindow" Height="400" Width="400">
<Grid>
<Canvas x:Name="DrawingCanvas" />
</Grid>
</Window>
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace FreeformDrawing
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private Polygon polygon;
private bool isDrawing = false;
public MainWindow()
{
InitializeComponent();
}
public void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (!isDrawing)
{
isDrawing = true;
polygon = new Polygon()
{
Stroke = Brushes.Black,
StrokeThickness = 1,
StrokeMiterLimit = 1,
StrokeLineJoin = PenLineJoin.Round,
StrokeStartLineCap = PenLineCap.Round,
StrokeEndLineCap = PenLineCap.Round
};
AddPoint(e.GetPosition(DrawingCanvas));
DrawingCanvas.Children.Add(polygon);
}
}
public void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
isDrawing = false;
if (polygon != null)
{
polygon.Points.Add(polygon.Points.First());
polygon.Fill = Brushes.Yellow;
}
}
public void Window_MouseMove(object sender, MouseEventArgs e)
{
if (isDrawing)
{
AddPoint(e.GetPosition(DrawingCanvas));
}
}
private void AddPoint(Point value)
{
if (value.X < (DrawingCanvas.ActualWidth - 1)
&& value.Y < (DrawingCanvas.ActualHeight - 1))
{
polygon.Points.Add(value);
}
}
}
}
Si vous utilisez un Polygon, vous pouvez Il suffit de combiner le dernier point et le point initial, puis de le remplir avec une couleur en utilisant la propriété Polygon.Fill. –
@Claus - vous devriez faire une réponse pour que je puisse voter! – codekaizen