Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 14

Перерисовка фигуры на форме. Refresh и Invalid

25.02.2018, 16:50. Показов 1719. Ответов 0

Студворк — интернет-сервис помощи студентам
В общем было задано нарисовать фигуру, которую можно повернуть, изменить размер и переместить. Все это здесь работает, но по отдельности, то есть если первоначально фигура имела стандартный размер, увеличить ее, а затем нажать на кнопку перевернуть, то перевернется не увеличенная, а первоначальная фигура.
Я пытаюсь решить эту проблему так:
Поворачиваю/масштабирую/перемещаю фигуру и изменяю переменные, в которых хранятся координаты этой фигуры, а затем перерисовываю ее.
Но, если в тупую заюзать метод printShape(), то вылетает ошибка. Я как понимаю, нужно обновить/сбросить/сделать недействительной форму и затем сделать перерисовку вызвав мой метод printShape(). Нагуглил я только Refresh() и Invalid, но как это работает я так и не понял(msdn читал, но все равно не понял).
Не могли вы бы мне объяснить про методы refresh и invalid, а так же помочь разобраться с перерисовкой. И если есть, предложить еще какие либо варианты решений моей проблемы.
Код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;
using System.Collections;
 
namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        Polygon myPolygon = new Polygon();
         
        double x1 = -50, x2 = 0, x3 = 50, rotate, rot = 0;
        int countResize = 0, countReplace = 0, stepShape = 1;
        double sxR = 1.2, syR = 1.2, sxP = 10, syP = 10;
        bool Place = true;
 
        public MainWindow()
        {
            InitializeComponent();
            printShape();
        }
        private void printShape()
        {
            myPolygon.Stroke = Brushes.Black;
            myPolygon.Fill = Brushes.LightSeaGreen;
            myPolygon.StrokeThickness = 2;
            myPolygon.HorizontalAlignment = HorizontalAlignment.Center;
            myPolygon.VerticalAlignment = VerticalAlignment.Center;
            Point Point1 = new Point(x1, x2);
            Point Point2 = new Point(x2, x3);
            Point Point3 = new Point(x3, x2);
            PointCollection myPointCollection = new PointCollection();
            myPointCollection.Add(Point1);
            myPointCollection.Add(Point2);
            myPointCollection.Add(Point3);
            myPolygon.Points = myPointCollection;
            grid1.Children.Add(myPolygon);
        }
        private void textBox(object sender, TextChangedEventArgs e) 
        {
            TextBox angle = (TextBox)sender;
            rotate = double.Parse(angle.Text);
        }
        private void turn(object sender, RoutedEventArgs e)
        {
            rot += rotate;
            RotateTransform rotateTransform = new RotateTransform(rot);
            rotateTransform.CenterX = 0;
            rotateTransform.CenterY = 0;
            myPolygon.RenderTransform = rotateTransform;
        }
        private void resize(object sender, RoutedEventArgs e)
        {
           
            if (countResize < 5) { sxR += 0.2; syR += 0.2; } else { sxR = syR = 1; countResize = 0; }
            ScaleTransform scaleTransform = new ScaleTransform(sxR, syR, 0, 0);
            myPolygon.RenderTransform = scaleTransform;
            countResize++;
        }
        private void replace(object sender, RoutedEventArgs e)
        { 
            if (Place) { sxP += 10; syP += 10; } else { sxP -= 10; syP -= 10; }
            TranslateTransform translateTransform = new TranslateTransform(sxP,syP);
            myPolygon.RenderTransform = translateTransform;
            countReplace += stepShape;
            if (countReplace > 5) { Place = false; stepShape *= (-1); }
            if (countReplace == 0) { Place = true; stepShape *= (-1); }
        }
    }   
}
Форма
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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="350" Width="525">
    <Grid Name="grid1">
        <Button  Content="Повернуть" HorizontalAlignment="Left" Margin="45,277,0,0" VerticalAlignment="Top" Width="100" Click="turn" />
        <Button  Content="Именить размер" HorizontalAlignment="Left" Margin="158,277,0,0" VerticalAlignment="Top" Width="100" Click="resize"/>
        <Button  Content="Переместить" HorizontalAlignment="Left" Margin="275,277,0,0" VerticalAlignment="Top" Width="100" Click="replace"/>
        <TextBox HorizontalAlignment="Left" Height="20" Margin="45,252,0,0" TextWrapping="Wrap" Text="30" VerticalAlignment="Top" Width="100" TextChanged ="textBox"/>
    </Grid>
</Window>
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.02.2018, 16:50
Ответы с готовыми решениями:

Перерисовка объектов на форме
Есть такое событие private void Form1_Paint(object sender, PaintEventArgs e) на форме, которое отрисовывает все, что мы там захотим! Если...

Перерисовка таблицы на форме
Здравствуйте у меня следующая проблема. есть объект JTbale который использует модель таблицы Listtablemodel данные в таблицу заносятся из...

Перерисовка графики в форме
Подскажите что настроить и где, может чего дописать для того, чтобы после того как моё окно с графикой внутри перекрывается другим окном...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.02.2018, 16:50
Помогаю со студенческими работами здесь

Перерисовка элементов (прямоугольников) в форме
При сворачивании/открытии новой формы, пропадают все нарисованные прямоугольники. Не получается реализовать их перерисовку в форме с...

Перерисовка панели в форме с задержкой Sleep
private void Draw() { Draw1(); Thread.Sleep(3000); Draw2(); Thread.Sleep(3000); Draw3(); } Каждый из методов DrawN задаёт...

Перерисовка линий на форме, получается "мигание"
У меня следующая проблема: необходимо часто перерисовывать линии на форме. Сейчас реализую сначала очищая форму, а потом рисуя по-новой. Но...

Движение фигуры в форме
Добрый день всем. Помогите, пожалуйста, очень прошу. Дано задание: реализовать движение по форме прямоугольника с заливкой в виде...

Движение фигуры в форме
Всем доброго времени суток! Очень буду благодарен, если кто откликнется и поможет! У меня в программе есть круг, который движется тремя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru