Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Olejikstu
8 / 8 / 3
Регистрация: 27.09.2010
Сообщений: 50
1

Интерактивная карта: как добраться до Path через Canvas

04.10.2012, 19:44. Просмотров 2035. Ответов 9
Метки нет (Все метки)

Добрый вечер уважаемые формчане. Возникла небольшая проблема. Пытаюсь реализовать интерактивную карту... Саму карту реализовал, но вот не могу понять как добраться до Path через Canvas, а точнее зная имя Canvas. Мне нужно через name Canvas получить нужный Path и изменить его цвет. Вот привожу отрывок xaml файла:
XML
1
2
3
4
5
6
<Canvas x:Name="Крым" Width="279.952" Height="625.084" Canvas.Left="0" Canvas.Top="0">
<Path x:Name="_977_points_" Width="219.453" Height="136.117" Canvas.Left="514.093" Canvas.Top="456.254" Stretch="Fill" Fill="#FFFFFFFF" Data="..."/>
</Canvas>
<Canvas x:Name="Севастополь" Width="279.952" Height="625.084" Canvas.Left="0" Canvas.Top="0">
<Path x:Name="Path" Width="23.6797" Height="23.6891" Canvas.Left="574.06" Canvas.Top="554.122" Stretch="Fill" StrokeMiterLimit="2.75" Stroke="#FF1D1D1B" Fill="#FFFFFFFF" Data=... "/>
</Canvas>
И так далее, все 25 украинских областей... В Listbox у меня занесены имена всех областей, и есть простой color picker, вот нажимая на нужные области в Listbox нужно как то присвоить значение колорпикера полю Fill нужному элементу Path. Значение элементов ListBox являются идентичными соответственному имени Canvas , внутри которого нужный мне Path. Помогите пожалуйста решить проблему, заранее спасибо...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2012, 19:44
Ответы с готовыми решениями:

[WPF] "Path" является неоднозначной ссылкой между "System.Windows.Shapes.Path" и "System.IO.Path"
Здравствуйте! Делаю экспорт из программы в Excel. Код брался от WinForm,...

Как сделана интерактивная карта?
Здравствуйте подскажите для создания такого...

Интерактивная карта / псевдо карта
Всем добрый день. Столкнулся с проблемой построения интерактивной карти....

интерактивная карта
Здравствуйте, мне нужно создать пользовательскую карту на сайте. Т.е мое...

Интерактивная карта
Здравствуйте. Подскажите, как можно сверстать подобного рода карту, как на...

9
KIMka
8 / 8 / 2
Регистрация: 20.02.2009
Сообщений: 139
04.10.2012, 21:46 2
Решал подобную проблему с картами и элементами xalm через usercontrol на winform. При загрузке формы, в неё передаются все параметры и переменные, с помощью обработчика событий load применяю те или иные параметры к элементам. Примерно так, отрывок из кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                        if (index >= listColors.Count) { index = listColors.Count - 1; }
                        System.Drawing.Color color = listColors[index];
                        System.Windows.Media.Color mColor = System.Windows.Media.Color.FromRgb(color.R, color.G, color.B);
                        solidColorBr = new System.Windows.Media.SolidColorBrush(mColor);
                        solidColorBr.Color = mColor;
                        
 
                        object item = mapControl1.FindName(name);
                        if (item != null)
                        {
                            System.Windows.Shapes.Shape sh = (System.Windows.Shapes.Shape)item;
                            sh.Fill = solidColorBr;
                            item = sh;
 
                            System.Windows.Shapes.Path pth = (System.Windows.Shapes.Path)item;
                            pth.ToolTip = subject_name + "\n" + field + " - " + value;
                            item = pth;
                        }
Это конкретно изменение цвета и tooltip. Ищу объекты на usercontrol по имени элементов в xalm.

Дабы не плодить темы: как обработать событие doubleclick в usercontrol и найти path, по которому кликнули? Заранее спс.
1
Olejikstu
8 / 8 / 3
Регистрация: 27.09.2010
Сообщений: 50
04.10.2012, 22:48  [ТС] 3
За код спасиба огромное!Я почти так же делал,как ты, сейчас буду пробовать....
Цитата Сообщение от KIMka Посмотреть сообщение
Дабы не плодить темы: как обработать событие doubleclick в usercontrol и найти path, по которому кликнули? Заранее спс.
По поводу даблклика вот неплохое видео
а вот поиск элемента, при клике на него...через сендер...
C#
1
2
3
4
5
6
7
8
9
10
 void c_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Canvas c = sender as Canvas;
            if (!string.IsNullOrEmpty(c.Name))
            {
                PopulateContextMenu(c.Name);
                PositionContextMenu(e.GetPosition(contextMenu.Parent as UIElement), true);
                e.Handled = true;
            }
        }
1
KIMka
8 / 8 / 2
Регистрация: 20.02.2009
Сообщений: 139
04.10.2012, 23:35 4
Теперь бы соорудить из MouseLeftButtonUp условие, если произошел double MouseLeftButtonUp...как?

ПС: затупил. if(e.clickCount == 2)
0
Olejikstu
8 / 8 / 3
Регистрация: 27.09.2010
Сообщений: 50
05.10.2012, 00:00  [ТС] 5
C#
1
2
3
4
5
6
7
8
9
10
11
 private void button1_Click(object sender, RoutedEventArgs e)
        {
            object item = this.FindName("Nikolaevska");
            
            if (item != null)
            {
                System.Windows.Shapes.Shape sh = (System.Windows.Shapes.Shape)item;
                sh.Fill = new SolidColorBrush(colorPicker1.Color);
                item = sh;
            }
            else MessageBox.Show("fdhj ds dfjsds");}
Не выходит так сделать... Вот потестил, и item на момент проверки if-ом = null, не могу понять почему не находит, ведь должно вроде бы как находить...((
0
KIMka
8 / 8 / 2
Регистрация: 20.02.2009
Сообщений: 139
05.10.2012, 00:24 6
Ищи по canvas, а не по this.

Плюс ко всему прочему, необходимо сделать разметку карты типа:
XML
1
2
3
4
5
6
7
8
9
10
11
12
 <Canvas Name="svg2" Width="1041" Height="605.1">
                            <Path Uid="46" Name="Ingushetia" Tag="Республика Ингушетия">
                                <Path.Data>
                                    <PathGeometry FillRule="Nonzero" Figures="M62.285,545.3L64.815,545.3 65.045,543.529 64.315,540.909 65.045,536.979 67.255,536.119 68.415,538.29 71.065,540.35 70.415,542.869 68.845,546.34 66.855,549.5 64.335,551.29 63.505,548.29 60.665,547.949z" />
                                </Path.Data>
                            </Path>
                            <Path Uid="50" Name="North_Ossetia_Alania" Tag="Республика Северная Осетия - Алания">
                                <Path.Data>
                                    <PathGeometry FillRule="Nonzero" Figures="M65.045,536.979L64.315,540.909 65.045,543.529 64.815,545.3 62.285,545.3 60.665,547.949 60.085,546.199 58.005,544.119 54.335,543.619 52.005,541.29 51.335,535.949 53.555,535.21 55.005,535.529 56.495,534.63 58.625,534.63 60.275,536 61.295,534.989 64.315,534.81 65.545,533.59 65.545,531.6 66.805,530.489 70.005,533.369 70.665,536.199 67.255,536.119z" />
                                </Path.Data>
                            </Path>
</Canvas>
Добавлено через 12 минут
Как по координатам клика установить на какой path был клик?
C#
1
2
3
4
5
6
7
8
9
10
11
            Canvas c = sender as Canvas;
            object obj;
            if (e.ClickCount == 2)
            {
                if (!string.IsNullOrEmpty(c.Name))
                {
                    obj = e.GetPosition(c.Parent as UIElement);
                    e.Handled = true;
 
                }
            }
0
Olejikstu
8 / 8 / 3
Регистрация: 27.09.2010
Сообщений: 50
05.10.2012, 11:55  [ТС] 7
чего то я не пойму, какие координаты? Ты хочешь кликать на какую то область на карте и что бы определялось на какой именно объект ты кликаешь? Если я правильно понял, то тебе просто нужно содержимое сендера привести к типу канвас... так как если ты кликаешь по канвасу, то в ивент клик передается объект, который по сути и есть твой канвас или пас....
0
KIMka
8 / 8 / 2
Регистрация: 20.02.2009
Сообщений: 139
05.10.2012, 12:21 8
В том то и дело, что
C#
1
2
Canvas c = sender as Canvas;
object obj = e.GetPosition(c.Parent as UIElement);
возвращается не объект, по которому кликнули, а координаты клика.
0
romasimeiz
6 / 6 / 2
Регистрация: 11.04.2011
Сообщений: 260
29.10.2012, 15:17 9
Olejikstu,

Добрый день! У меня также стоит задача, вывести на форму карту Украины. Если вам не трудно, скиньте ту часть проекта, которая выводит на форму карту Украины. Буду очень благодарен. Спасибо!
0
Hermit
2 / 2 / 1
Регистрация: 29.01.2015
Сообщений: 37
12.11.2012, 20:08 10
Изучаю понемногу WPF, у Троелсена увидел такой способ для определения, на какой shape кликнули:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void mouse_left_button_click(object sender, MouseButtonEventArgs e)
{
   // Получаем координаты клика
   Point pt = e.GetPosition((Canvas)sender);
   // Методом HitTest() класса VisualTreeHelper проверяем
   // попадание на элемент в Canvas
   HitTest result = VisualHelper.HitTest(canvasName, pt);
   // Если результат не null, клик произведен на фигуре
   if(result != null)
   {
      // Дальше можно пользоваться результатом, например удалить фигуру из Canvas:
      canvasName.Children.Remove(result.VisualHit as Shape);
   }
}
Вот как-то так, надеюсь, пригодится
0
12.11.2012, 20:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2012, 20:08

Интерактивная карта
Доброго времени суток! Пытаюсь создать интерактивную карту, взял пример тут...

Интерактивная 3D карта
Приветствую участников форума. Господа, в силу сложившихся обстоятельств...

Интерактивная карта ТЦ
Товарищи! Может кто сталкивался с такой проблемой в Битриксе. Версия старенькая...


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

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

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