Приложение WPF - Не удалось изменить свойства прямоугольника на MouseDown - PullRequest
0 голосов
/ 14 марта 2019

У меня есть простое приложение WPF, которое является оконным приложением. В этом окне есть холст. То, что я хочу сделать, это когда я перемещаю мышь на холсте. На холсте должен быть нарисован прямоугольник, а затем, когда я нажимаю левую кнопку мыши, цвет прямоугольника должен измениться. Я прекрасно могу нарисовать прямоугольник на событии перемещения мыши, а также получать событие MouseDown на Rectangle, но когда я пытаюсь изменить цвет этого прямоугольника, это не работает. Код очень прост

Вот мой xaml-файл

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Canvas Background="#11FFFFFF"  IsHitTestVisible="True" x:Name="overlay" Opacity="1">

        </Canvas>
    </Grid>
</Window>

и вот мой файл xaml.cs

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            overlay.MouseMove += OnOverlayMouseMove;
        }

        private void OnOverlayMouseMove(object sender, MouseEventArgs args)
        {
            overlay.Children.Clear();

            Point ps = args.GetPosition(overlay);

            Rectangle rect = new Rectangle
            {
                Fill = Brushes.LightBlue,
                Stroke = Brushes.LightGray,
                StrokeThickness = 2,
                Width = 100,
                Height = 50
            };

            rect.Opacity = 0.5;
            rect.MouseLeftButtonDown += OnRectLeftMouseButtonDown;
            rect.Name = "Blue";

            Canvas.SetLeft(rect, ps.X - 50);
            Canvas.SetTop(rect, ps.Y - 25);
            overlay.Children.Add(rect);
        }

        private void OnRectLeftMouseButtonDown(object sender, MouseEventArgs args)
        {
            Rectangle rect = sender as Rectangle;

            if (rect.Name.Equals("Blue"))
            {
                rect.Fill = Brushes.Black;
                rect.Name = "Black";
            }
            else
            {
                rect.Fill = Brushes.LightBlue;
                rect.Name = "Blue";
            }

            args.Handled = true;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Я думаю, вам нужно что-то вроде этого:

public partial class MainWindow : Window
{
    private Color normal = Color.FromRgb(255, 0, 0);
    private Color active = Color.FromRgb(0, 0, 0);

    private SolidColorBrush rectangleBrush;


    public MainWindow()
    {
        InitializeComponent();

        rectangleBrush = new SolidColorBrush(normal);
        overlay.MouseMove += OnOverlayMouseMove;
    }

    private void OnOverlayMouseMove(object sender, MouseEventArgs args)
    {
        overlay.Children.Clear();

        Point ps = args.GetPosition(overlay);

        Rectangle rect = new Rectangle
        {
            Fill = rectangleBrush,
            Stroke = Brushes.LightGray,
            StrokeThickness = 2,
            Width = 100,
            Height = 50
        };

        rect.Opacity = 0.5;
        rect.MouseLeftButtonDown += OnRectLeftMouseButtonDown;

        Canvas.SetLeft(rect, ps.X - 50);
        Canvas.SetTop(rect, ps.Y - 25);
        overlay.Children.Add(rect);
    }

    private void OnRectLeftMouseButtonDown(object sender, MouseEventArgs args)
    {
        Rectangle rect = sender as Rectangle;

        if ((rect.Fill as SolidColorBrush).Color == normal) {
            rectangleBrush.Color = active;
        } else {
            rectangleBrush.Color = normal;
        }

        args.Handled = true;
    }
}

Если вы хотите использовать цвета из Color struct, просто замените нормальные и активные переменные на "Colors.LightBlue" и "Colors.Black"

0 голосов
/ 14 марта 2019

Цвет не меняется, потому что вы создаете новый прямоугольник при каждом вызове OnOverlayMouseMove и устанавливаете Fill в LightBlue

Вы можете сделать что-то вроде следующего,

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            overlay.MouseMove += OnOverlayMouseMove;
        }

        private void OnOverlayMouseMove(object sender, MouseEventArgs args)
        {
            overlay.Children.Clear();

            Point ps = args.GetPosition(overlay);

            Rectangle rect = new Rectangle
            {
                Fill = brush,
                Stroke = Brushes.LightGray,
                StrokeThickness = 2,
                Width = 100,
                Height = 50
            };

            rect.Opacity = 0.5;
            rect.MouseLeftButtonDown += OnRectLeftMouseButtonDown;
            rect.Name = "Blue";

            Canvas.SetLeft(rect, ps.X - 50);
            Canvas.SetTop(rect, ps.Y - 25);
            overlay.Children.Add(rect);
        }
        private SolidColorBrush brush = Brushes.LightBlue;
        private void OnRectLeftMouseButtonDown(object sender, MouseEventArgs args)
        {
            Rectangle rect = sender as Rectangle;

            if (brush == Brushes.LightBlue)
            {
                brush = Brushes.Black;
            }
            else
            {
                brush = Brushes.LightBlue;
            }

            args.Handled = true;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...