Создание и доступ к GeometryGroup в CodeBehind

#c# #wpf

#c# #wpf

Вопрос:

я новичок в сообществе StackOverflow и, пожалуйста, извините за мой плохой английский, я пытаюсь его улучшить.

Я использую вашу помощь для моей бакалаврской диссертации, и вы мне уже очень помогли, спасибо. Я пишу инструмент для визуализации данных в беспроводных сетях.

Я добавляю GeometryGroup в свой холст, чтобы соединить некоторые из моих пользовательских элементов управления с помощью строки. Строка обновляется при перемещении элемента управления и т. Д. Я использовал следующую статью: https://denisvuyka.wordpress.com/2007/10/21/wpf-diagramming-drawing-a-connection-line-between-two-elements-with-mouse / чтобы заставить его работать.

Это код, который я использую в своем XAML.

 <Path Name="myPath" Stroke="#FF132FE0" StrokeThickness="1">
                <Path.Data>
                    <GeometryGroup x:Name="connectors"/>
                </Path.Data>
</Path>
  

То, что я пытаюсь сделать, это создать свой собственный класс canvas и добавить GeometryGroup в коде позади. То, что я пытался сделать, было:

 System.Windows.Shapes.Path pathGroup= new System.Windows.Shapes.Path(); 
BrushConverter bc = new BrushConverter();
Brush Brush = (Brush)bc.ConvertFrom("#FF132FE0");
cmp.Stroke = Brush;
cmp.StrokeThickness = 1;
GeometryGroup connectors= new GeometryGroup();
pathGroup.Data=connectors;
  

Моя проблема в том, что это не сработало так, как предполагалось. С реализацией XAML я могу просто использовать следующее:

 connectors.Children.Add(obj);
  

Я пытаюсь подвести итог своей проблеме. Я хотел бы создать с помощью c # -code GeometryGroup, чтобы иметь возможность добавлять и удалять строки, когда я этого захочу.

Спасибо =)

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

1. Вы, вероятно, никогда не используете pathGroup нигде в своем Canvas.

2. Как я могу получить доступ к дочерним элементам PathGroup? Нет такого атрибута, как дочерние элементы getChildren или Data . Дочерние элементы. Я даже не знаю, как получить доступ к строкам, которые я добавляю в GeometryGroup. Возможно, это моя проблема.

3.Вам не нужно «обращаться к дочерним элементам PathGroup». Как и раньше, вы должны получить доступ к дочернему свойству connectors . Однако вам придется добавить pathGroup в коллекцию дочерних элементов Canvas.

4. Это была именно моя проблема. Спасибо за вашу помощь!

Ответ №1:

Возможно, вам захочется иметь производный холст с connectors полем (аналогичным тому, который создан из XAML, показанного в вашем вопросе).

Холст будет рисовать соединители с помощью переопределенного OnRender метода, как показано ниже.

 public class CustomCanvas : Canvas
{
    private readonly GeometryGroup connectors = new GeometryGroup();

    protected override void OnRender(DrawingContext dc)
    {
        var stroke = new SolidColorBrush(Color.FromRgb(0x13, 0x2F, 0xE0));

        dc.DrawGeometry(null, new Pen(stroke, 1), connectors);

        base.OnRender(dc);
    }
}
  

Некоторый дополнительный код в другом методе производного класса Canvas теперь будет добавлять или удалять объекты Geometry в / из Children коллекции connectors объекта.


Вы, конечно, также можете захотеть объявить свойства для Stroke соединителя, StrokeThickness и т. Д.

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

1. Это то, что я постараюсь реализовать! Это гораздо более чистый способ реализовать эту функцию.