Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/24: Рейтинг темы: голосов - 24, средняя оценка - 4.58
gspit
1 / 1 / 0
Регистрация: 10.05.2011
Сообщений: 46
1

DrawingVisual, что это такое и с чем его едят, или как перерисовать

15.06.2011, 21:23. Просмотров 4534. Ответов 3
Метки нет (Все метки)

Суть: есть Canvas (с координатами x) на котором рисуются DrawingVisual'ы, далее делается замена координат y = Ax + b, далее надо перерисовать старые DrawingVisual'ы в новых координатах.

Как это реализовано у меня:
//Я шел по книге: pro WPF in C# 2008 Matthew MacDonald, поэтому реализация может быть не самая лучшая
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
class DrawingCanvas : Canvas {       
        public List<Visual> visuals = new List<Visual>();
 
        protected override int VisualChildrenCount {
            get { return visuals.Count; }
        }
        protected override Visual GetVisualChild(int index) {
            return visuals[index];
        }
        public void AddVisual(Visual visual) {
            visuals.Add(visual);
            base.AddVisualChild(visual);
            base.AddLogicalChild(visual);
        }
        public void AddVisual(int index, Visual visual) {
            visuals.Insert(index, visual);
            base.AddVisualChild(visual);
            base.AddLogicalChild(visual);
        }
        public void DeleteVisual(Visual visual) {
            visuals.Remove(visual);
            base.RemoveVisualChild(visual);
            base.RemoveLogicalChild(visual);
        }  
}
Рисую я так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void Draw(){
    DrawingVisual visual = new DrawingVisual();
    DrawingContext dc = visual.RenderOpen();
    Pen drawingPen = new Pen(Brushes.Red, 1);
    Point startPoint = new Point();
    Point endPoint = new Point();           
         
    for (int j = 0; j < 3000; j++) {
        obj.Integrate();
        dc.DrawLine(drawingPen, startPoint, endPoint);
        startPoint = endPoint;
        }
            
     dc.Close();
     drawingSurface.AddVisual(visual);//!!!
}
В итоге: я хочу вынуть все DrawingVisual'ы из visuals, модифицировать их и положить обратно
но я не знаю, что из себя представляет DrawingVisual, как он хранится, как отрисовывается итд

Буду рад получить инфу по этим вопросам (ссылки, названия книг, итд)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2011, 21:23
Ответы с готовыми решениями:

Что такое DI фреймворки и с чем их едят
Здравствуйте уважаемые жители кибер-форума. У меня достаточно тривиальный...

ReSharper что это и с чем едят?
сабж... желательно поподробнее и с простенькими примерами... копался в гугле,...

API как и с чем с чем его едят?
Добрался до API, прошу вас кинуть материала где можно почитать про него, а...

Что это такое и как это можно сделать?
Это что то из стандартных компонентов или как в своем проекте сделать что то...

Что производительнее, Shape или та же фигура нарисованная через DrawingVisual?
Добрый день, у меня два вопроса по производительности. 1. Что...

3
kenny69
burning1ife
1413 / 1235 / 292
Регистрация: 21.09.2008
Сообщений: 3,409
Записей в блоге: 9
16.06.2011, 10:26 2
http://msdn.microsoft.com/ru-ru/library/ms742254.aspx

насколько я помню, модификатор доступа для visuals стоит в private, оберни просто в public св-во свои visuals, и модифицируй их.
1
gspit
1 / 1 / 0
Регистрация: 10.05.2011
Сообщений: 46
17.06.2011, 02:52  [ТС] 3
Собственно вопрос в том, как мне их модифицировать (с помощью каких методов)
Я пробовал делать так:
C#
1
2
3
4
dc = visual.RenderOpen();
dc.PushTransform(transform);
dc.Close();
tmpColl.Add(visual);
Потом из tmpColl копировал обратно. не помогло.
А должно ли помочь?
0
kenny69
burning1ife
1413 / 1235 / 292
Регистрация: 21.09.2008
Сообщений: 3,409
Записей в блоге: 9
17.06.2011, 12:17 4
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
 
namespace WpfApplication46
{
    class DrawIt : FrameworkElement
    {
        VisualCollection visuals;
 
        public VisualCollection Visuals
        {
            get { return visuals; }
            set { visuals = value; }
        }
 
        public DrawIt()
        {
            visuals = new VisualCollection(this);
 
            this.Loaded += new RoutedEventHandler(DrawIt_Loaded);
        }
 
        void DrawIt_Loaded(object sender, RoutedEventArgs e)
        {
            int x = 0;
 
            for (int i = 0; i <= 1; i++)
            {
                DrawingVisual visual = new DrawingVisual();
                using (DrawingContext dc = visual.RenderOpen())
                {
                    dc.DrawRectangle(Brushes.Red, new Pen(Brushes.Black, 2),
                        new Rect(new Point(0 + x, 0), new Size(40, 40)));
                }
                visuals.Add(visual);
                x += 60;
            }
        }
 
        
        protected override Visual GetVisualChild(int index)
        {
            return visuals[index];
        }
 
        protected override int VisualChildrenCount
        {
            get
            {
                return visuals.Count;
            }
        }
    }
 
}
XML
1
2
3
4
5
6
7
8
9
10
<Window x:Class="WpfApplication46.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication46"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:DrawIt x:Name="drawIt" Width="100" Height="100"/>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="222,228,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
  private void button1_Click(object sender, RoutedEventArgs e)
        {
            //получаем наш первый прямоугольник и изменяем его цвет
            DrawingVisual visual = (DrawingVisual)drawIt.Visuals[0];
             using (DrawingContext dc = visual.RenderOpen())
                {
                    dc.DrawRectangle(Brushes.Orange, new Pen(Brushes.Black, 2),
                        new Rect(new Point(0 , 0), new Size(40, 40)));
                }
            
        }
1
Вложения
Тип файла: rar WpfApplication46.rar (54.4 Кб, 155 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2011, 12:17

Mvvm и с чем его едят
Форумчане не так давно начал изучение wpf ,не подскажете что такое mvvm Патерн...

wpf DataGrid с чем его едят?
Подскажите как в wpf добавить дата грид т.к. в референс библиотеку с хожим...

Класс iList - что это и как его использовать
Ребят, в общем дали задание по курсачу, описать класс iList(на его основе...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru