จะวาดเส้นใหม่บนผืนผ้าใบตามการยุบหรือขยายรายการ treeview ได้อย่างไร

ฉันมีมุมมองแบบต้นไม้ในมุมมอง 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>

จากนั้นฉันก็ได้รับตำแหน่งรายการ 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 ได้เพิ่มเป็นแหล่งที่มาของ Canvas และวาดเส้นดังนี้

<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>

คำถามของฉันที่นี่คือฉันจะวาดเส้นใหม่เมื่อรายการมุมมองต้นไม้ขยายหรือยุบได้อย่างไร ขณะนี้บรรทัดจะอยู่ที่นั่นในการประสานงานเดียวกันเมื่อฉันขยายและยุบรายการ treeview

มีข้อเสนอแนะใด ๆ เกี่ยวกับปัญหานี้หรือไม่?


person Shanjee    schedule 06.01.2020    source แหล่งที่มา
comment
คุณต้องการเชื่อมโยงการมองเห็น Line กับคุณสมบัติ IsExpanded ของรายการ treeview บางทีถ้าคุณทำให้มันง่ายเหมือนกับที่คุณมีโอกาสที่จะหาคำตอบได้ดีขึ้น   -  person Bizhan    schedule 06.01.2020
comment
หมายเหตุอีกประการหนึ่ง เนื่องจากคุณมีเพียงบรรทัดเดียว ทำไมไม่ใช้แผงอื่นแทน Canvas? ส่วนแผงอื่นๆ จะถูกจำกัดตามขนาดซึ่งต่างจากผืนผ้าใบ   -  person Bizhan    schedule 06.01.2020
comment
@Bizhan ไม่ใช่บรรทัดเดียว จะมีหลายบรรทัดพร้อมกับสีที่แตกต่างกัน เมื่อผู้ใช้ยุบรายการมุมมองต้นไม้ บรรทัดก็ควรได้รับการอัปเดต ในกรณีของฉัน ธรณีประตูบรรทัดยังคงเป็นตำแหน่งเดิมเมื่อ treeview ยุบ เนื่องจากบรรทัด ตำแหน่งเริ่มต้นถูกนำมาจากการประสานงาน 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