Как объединить несколько объектов GeometryGroup?

#c# #.net #wpf #graphics

#c# #.net #wpf #графика

Вопрос:

У меня есть 2 разные GeometryGroup коллекции, которые я хочу объединить, но не смог найти ничего в сети для этого. Есть идеи, как это сделать?

Ответ №1:

Вам нужно будет добавить Children из одной коллекции в другую или создать третью, новую GeometryGroup , которая выполняет объединение обоих дочерних элементов. Например:

 GeometryGroup newGroup = new GeometryGroup();
foreach(var child in group1.Children.Union(group2.Children)) 
   newGroup.Children.Add(child);
  

Комментарии:

1. Спасибо, Рид, это единственный способ? Потому что в моем цикле я просто изменяю содержимое этих обеих коллекций, чтобы изменить их позиции и т.д. Если я объединю их в каждом экземпляре, то мне придется создавать новую GeometryGroup для каждого кадра моего приложения (30 кадров в секунду) с общим количеством фигур 200. Я полагаю, это было бы большими накладными расходами, верно? Может быть, мне следует использовать 2 элемента управления canvas?

2. Спасибо, Рид, в таком случае, есть ли способ указать композицию? Я не уверен, как объединить результаты нескольких элементов управления canvas.

3. @Joan: Вы можете просто поместить их оба в сетку, в одну строку / столбец, и они будут идеально «перекрываться». По умолчанию это прозрачные фоны, так что это должно просто сработать. Единственной проблемой будет z-упорядочение — вам придется выполнять z-упорядочивание на холсте по уровню холста, поэтому, если у вас есть пути перекрытия, содержимое одного холста всегда будет «поверх» другого.

4. @Joan: Да — по умолчанию сетка состоит из ячеек 1×1. Просто поместите оба элемента управления canvas внутри сетки, и это то, что вы получите 😉

5. @Joan: Нет — по умолчанию они будут помещены в строку 0 и столбец 0. Вам нужно только установить прикрепленные реквизиты (Grid.Row / Column), если вы хотите, чтобы они были где-то в другом месте (хотя я часто все еще устанавливаю их явными)