Как перерисовывать линии на холсте на основе свертывания или расширения элемента дерева?

У меня есть древовидное представление в моем представлении 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>

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

любое предложение по этой проблеме?


person Shanjee    schedule 06.01.2020    source источник
comment
Вы хотите привязать видимость Line к свойству IsExpanded элемента дерева. может быть, если вы сделаете это так просто, у вас будет больше шансов найти ответ   -  person Bizhan    schedule 06.01.2020
comment
Еще одно замечание, поскольку у вас всего одна Линия, почему бы не использовать другую панель вместо Canvas? другие панели ограничены своими размерами, в отличие от холста.   -  person Bizhan    schedule 06.01.2020
comment
@Bizhan это не одна строка, будет несколько строк с разными цветами, как только пользователь свернет элемент древовидного представления, строки также должны быть обновлены, в моем случае строки остаются в том же положении, когда древовидное представление рушится, потому что строка исходная позиция была взята из координат X, Y элемента древовидного представления.   -  person Shanjee    schedule 08.01.2020
comment
извините, я неправильно понял вашу проблему. вам, вероятно, нужен механизм обновления. см. этот пост: stackoverflow.com/questions/11986840/wpf-treeview-refreshing   -  person Bizhan    schedule 08.01.2020
comment
Кстати, я не думаю, что это лучший подход. вы привязываете линии X, Y к их абсолютным координатам. возможно, вы захотите пересмотреть это. Я бы посоветовал найти учебник для этого   -  person Bizhan    schedule 08.01.2020