Как перерисовать линии на холсте, основываясь на сворачивании или развертывании элемента дерева - PullRequest
1 голос
/ 06 января 2020

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

<dc:Interaction.Triggers>
   <dc:EventTrigger EventName="MouseDoubleClick">
       <dc:InvokeCommandAction Command="{Binding TreeItemDoubleClickCommand}" 
            CommandParameter="{Binding ElementName=treeView, Path=ItemContainerGenerator}"/>
       </dc:EventTrigger>                       
   </dc:Interaction.Triggers>
</dc:TreeView>

затем я получаю позицию элемента древовидной структуры, как показано ниже

private void PerformDoubleClick(ItemContainerGenerator itmGenerator)
{
    var selectedItem = _dirItems.SelectMany(d => d.GetAllChildren()).FirstOrDefault(c => c.IsSelected);

    TreeViewItem tvii = ContainerFromItemRecursive(itmGenerator, selectedItem);

    if (tvii == null) return;
    TreeViewItem tvi = tvii;

    GeneralTransform myTransform = tvi.TransformToAncestor(tvii);

    Point myOffset = myTransform.Transform(new Point(0, 0));

    //canvas.Children.Clear();
    var line = new Line();
    line.Stroke = Brushes.LightSteelBlue;

    line.X1 = myOffset.X + tvii.ActualWidth;
    line.X2 = 700;
    line.Y1 = myOffset.Y + tvii.ActualHeight / 2;
    line.Y2 = 300;

    line.StrokeThickness = 2;
    //canvas.Children.Add(line); 
    var fromPoint = tvii.PointFromScreen(new Point()); 
    MappingLines.Add(new MappingLine { From = new Point(fromPoint2.X * -1.00 - 50, (fromPoint2.Y * -1.00 - 55)), To = new Point(X2, Y2), LineColor = GetRandomColor() });

}

позже MappingLines добавлен в качестве источника на холст и рисую линии, как показано ниже.

<ItemsControl DataContext="{Binding MappingDocumentViewModel.RightPanel }" ItemsSource="{Binding MappingLines}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Line X1="{Binding From.X}" Y1="{Binding From.Y}"
                  X2="{Binding To.X}" Y2="{Binding To.Y}"
                  Stroke="{Binding LineColor}" StrokeThickness="1"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

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

есть предложения по этой проблеме?

...