powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Размножение нарисованных совокупностей линий (Path) программно - как?
10 сообщений из 10, страница 1 из 1
Размножение нарисованных совокупностей линий (Path) программно - как?
    #38167407
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, у меня возникла задача реализации WEB карты железнодорожных путей на Silverlight. Столкнулся с необходимостью брать нарисованные предварительно в Expression Blend изображения (например вот такая вилка - |_|) как path - вот таким образом

<Path Name="ReelWayStandardLockup" Data="M80,40 L80,56 L96,56 L96,40" HorizontalAlignment="Left" Height="17" Margin="79.5,39.5,0,0" Stretch="Fill" Stroke="Black" UseLayoutRounding="False" VerticalAlignment="Top" Width="17"/>

, и вот их мне нужно программно размножать. Делаю так -

private Path ReelWayStandardLockup1 = null;

в качестве теста (пока так) в конструкторе создаём обычный объект типа Path

MainPage
{
///
///
///
this.ReelWayStandardLockup1 = new Path();
this.ReelWayStandardLockup1.Name = "WayStop1";
this.ReelWayStandardLockup1.StrokeThickness = 2;
this.LayoutRoot.Children.Add(this.ReelWayStandardLockup1);
}

а потом например на SizeChanged, (не суть важно), но делаем так

try
{
this.ReelWayStandardLockup1.Data = this.ReelWayStandardLockup.Data;
}
catch { }
this.ReelWayStandardLockup1.Stretch = this.ReelWayStandardLockup.Stretch;
this.ReelWayStandardLockup1.Fill = this.ReelWayStandardLockup.Fill;
this.ReelWayStandardLockup1.Stroke = this.ReelWayStandardLockup.Stroke;


this.ReelWayStandardLockup1.Margin = new Thickness(300, 300, 0, 0);


то есть создаю экземпляр ReelWayStandardLockup1 типа Path, и его поля прописываю тем что содержит образец ReelWayStandardLockup, а после того позиционирую его куда мне надо. (сам образец потом просто скрываю с карты например)

вот такая задача


Выпадает исключение при попытке присвоения собственно графического содержимого по образцу - this.ReelWayStandardLockup1.Data = this.ReelWayStandardLockup.Data;

ArgumentException - Значение не попадает в ожидаемый диапазон....


Что же делать? У меня задача разработки карты с типизацией объектов (станции, пути, симафоры, тупики и т.п. ), я немогу их просто нарисовать и всё. У меня программмно генерируються экземпляры станций, которые содержат в том числе (в качестве одного из своих полей) - объект графического представления (эллипс). Но для объектов "подъездной фронт" я немогу использовать эллипс. Мне нужно произвольное изображение. Их приходиться рисовать предварительно. Как их программно размножать по нарисованному образцу?

Кто сталкивался?
...
Рейтинг: 0 / 0
Размножение нарисованных совокупностей линий (Path) программно - как?
    #38170732
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
неужели никто не сталкивался... по сути выход из этой ситуации - создавать Path прямо программно с нуля (без всяких образцов). но это правда только временное решение. когда достаточно нарисовать 3 линии |_|, то всё просто. а вот в случае сложных фигур, рисовать их программно без шаблонного Path-а, это не приведи Господь... и вызывает сомнение по сути зачем он нужен этот бленд, рас толку с него никакого. опять куча возможностей всяких, наворотов и т.п. для дизайнеров, а вот для программиста это ни только не панацея опять, но и даже не вариант... ну что ж, пока обойдёмся временным решением
...
Рейтинг: 0 / 0
Размножение нарисованных совокупностей линий (Path) программно - как?
    #38171707
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
multiuser,
Blend и есть - для дизайнеров
...
Рейтинг: 0 / 0
Размножение нарисованных совокупностей линий (Path) программно - как?
    #38171862
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ООП люди не зря придумали. Создаете для каждого объекта свой контрол, там контрол для станции, для развилки и т.д... Затем натягиваете эти контролы на карту, хоть программно, хоть в бленде... Хотя возможно я что-то не так понял...
...
Рейтинг: 0 / 0
Размножение нарисованных совокупностей линий (Path) программно - как?
    #38172126
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKIСоздаете для каждого объекта свой контрол
Если надо всего лишь отрисовать готовый объект, то отдельный контрол на каждую пиктограмму - это как-то слишком. Топикстартера, думаю, спасет обычный VisualBrush .
...
Рейтинг: 0 / 0
Размножение нарисованных совокупностей линий (Path) программно - как?
    #38172848
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EDUARD SAPOTSKI, вы правильно поняли! Это тоже я рассматриваю уже как вариант. И да, было бы неплохим выходом делать их как контролы (мало того и выбирать их потом на карте проще будет, и всё что угодно делать). Стараюсь просто не навешивать много всего на элементы, поэтому сделав их контролами, заставить их тянуть за собой событийную модель я пока думаю стоит ли... Просто их много на карте будет (возможно тысячи), и каждый из них делать контролом... Всё таки пока пытаюсь оставить их голыми графическими интерпретирующими картинками, а для выборки, масштабирования карты, связки семантической информации и т.п. стараюсь использовать свою физику выбора и т.п. Ног возможно придётся пойти и по пути контролов. Спасибо за ваш отзыв.
...
Рейтинг: 0 / 0
Размножение нарисованных совокупностей линий (Path) программно - как?
    #38172919
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор, вы про VisualBrush выше внимательно прочитали?
Код: xml
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.
<Window.Resources>
  <Canvas
    x:Key="Railway">
    <Path
      Data="M80,40 L80,56 L96,56 L96,40"
      HorizontalAlignment="Left"
      Height="17"
      Width="17"
      Stretch="Fill"
      Stroke="Black"
      StrokeThickness="2"
      UseLayoutRounding="False"
      VerticalAlignment="Top"/>
  </Canvas>
  <VisualBrush
    TileMode="Tile"
    Viewport="0,0,20,20"
    Viewbox="0,0,20,20"
    ViewportUnits="Absolute"
    ViewboxUnits="Absolute"
    Visual="{StaticResource Railway}"
    x:Key="RailBrush1"/>
  <VisualBrush
    TileMode="None"
    Stretch="None"
    Visual="{StaticResource Railway}"
    x:Key="RailBrush2"/>
  <VisualBrush
    Visual="{StaticResource Railway}"
    x:Key="RailBrush3"/>
</Window.Resources>
<Grid>
  <Grid.RowDefinitions>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
  </Grid.RowDefinitions>
  <Border
    BorderThickness="1"
    BorderBrush="Red"
    Margin="20"
    Background="{StaticResource RailBrush1}"/>
  <Border
    Grid.Row="1"
    BorderThickness="1"
    BorderBrush="Green"
    Margin="20"
    Background="{StaticResource RailBrush2}"/>
  <Border
    Grid.Row="2"
    BorderThickness="1"
    BorderBrush="Blue"
    Margin="20"
    Background="{StaticResource RailBrush3}"/>
</Grid>
...
Рейтинг: 0 / 0
Размножение нарисованных совокупностей линий (Path) программно - как?
    #38173190
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делайте контролами и не дурите себе голову. В дальнейшем это избавит Вас от кучи гемора, потом клинет захочет что бы значки меняли цвет в зависимости от ситуации, были кликабельными и еще тысячи всевозможных хотелок. Используя контролы Вы будете реализовывать хотелки без всяких проблем. На производительности не загоняйтесь, тысячи контролов это не миллионы, метром больше оперативы сожрет - метром меньше - сегодня всем пофиг.
...
Рейтинг: 0 / 0
Размножение нарисованных совокупностей линий (Path) программно - как?
    #38173199
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Контролы никоим образом не избавляют от вопроса отрисовки созданного дизайнером изображения как единого ресурса. Изначальный вопрос был вроде как именно об этом. Воспроизводить отрисовку каждого ресурса на уровне примитивов с нуля в каждом контроле - более чем спорное решение.
...
Рейтинг: 0 / 0
Размножение нарисованных совокупностей линий (Path) программно - как?
    #38173247
multiuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, Спасибо я посмотрел это тоже! Позднее я вернусь к этому. Код который делал я, я искал ранее в примерах и выглядел он в оригинале так -

Path createPath(ObservableCollection<Point> rawData)
{
Path FinalPath = new Path();
PathGeometry FinalPathGeometry = new PathGeometry();
PathFigure PrimaryFigure = new PathFigure();
// Если вам нужно, чтобы Path был фигуро, тогда закройте PathFigure
// и Path замкнется автоматически. Но если вам нужна незамкнутая линия,
// поставьте PrimaryFigure.IsClosed = false;
PrimaryFigure.IsClosed = true;

PrimaryFigure.StartPoint = rawData[0];
PathSegmentCollection LineSegmentCollection = new PathSegmentCollection();
for (int i = 1; i < rawData.Count; i++)
{
LineSegment newSegment = new LineSegment();
newSegment.Point = rawData[i];
LineSegmentCollection.Add(newSegment);
}
PrimaryFigure.Segments = LineSegmentCollection;
FinalPathGeometry.Figures.Add(PrimaryFigure);
FinalPath.Data = FinalPathGeometry;
return FinalPath;
}

сам тот пример рабочий - вот он http://silverlight.su/viewtopic.php?id=138 - проверял естественно

в моём случае, такая логика не работала и выдавала исключение... особенности этого скорее всего в том, что они используют ObservableCollection (в отличии от меня). Её основная разница в предоставлении автоматически свойств set, get. Сёдня я столкнулся с тем, что в сильвере многое не работает с теми типами которые не предоставляют свойств. Хотя компилируется всё прекрасно. Причём эту ошибку времени выполнения, так просто не раскусить. Она не указывает что им видишь ли свойства нужны... Говорит - ожидался мол не такой набор данных, значение не попадает в диапазон и т.п. чушь... (потому что перехват исключения идёт на базе где-то... совсем не информативно). И попробуй пойми почему... Если свойства нужны - значит требует реализации особого интерфейса. Вот применил ObservableCollection всё попёрло сразу. Спасибо всем!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Размножение нарисованных совокупностей линий (Path) программно - как?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]