WPF Протрите верхнее изображение, чтобы показать изображение под ним - PullRequest
0 голосов
/ 23 января 2011

Как видно из заголовка, используя WPF, я хочу, чтобы у меня был сценарий, в котором у меня есть растровое изображение с наложенным поверх него другим растровым изображением и, используя мышь, "закрашиваем" верхнее растровое изображение, чтобы оно отображало растровое изображение под , Это так же просто, как рисовать прозрачной кистью? Я пробовал это безрезультатно, но, возможно, я что-то упустил.

1 Ответ

2 голосов
/ 23 января 2011

Вы можете использовать VisualBrush для создания OpacityMask. Вот кодовый пример замены темно-зеленого прямоугольника на светло-зеленый. При таком подходе два прямоугольника могут быть любыми элементами, включая изображения.

<Grid MouseMove="Grid_MouseMove">
    <Rectangle Fill="DarkGreen"/>
    <Rectangle Fill="LightGreen">
        <Rectangle.OpacityMask>
            <VisualBrush Stretch="None" AlignmentX="Left" AlignmentY="Top">
                <VisualBrush.Visual>
                    <Path Name="path" Stroke="Black" StrokeThickness="10"/>
                </VisualBrush.Visual>
            </VisualBrush>
        </Rectangle.OpacityMask>
    </Rectangle>
</Grid>

и вот код:

private void Grid_MouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        var point = e.GetPosition(sender as Grid);
        if (lastPoint != nullPoint)
            AddSegment(lastPoint, point);
        lastPoint = point;
    }
    else
    {
        lastPoint = nullPoint;
    }
}

private void AddSegment(Point point1, Point point2)
{
    if (segments.Count == 0 || segments[segments.Count - 1].Point != point1)
        segments.Add(new LineSegment(point1, false));
    segments.Add(new LineSegment(point2, true));
    var figures = new PathFigureCollection();
    figures.Add(new PathFigure(new Point(), segments, false));
    var geometry = new PathGeometry();
    geometry.Figures = figures;
    path.Data = geometry;
}

List<LineSegment> segments = new List<LineSegment>();
private static readonly Point nullPoint = new Point(-1, -1);
Point lastPoint = nullPoint;
...