C#WPF ViewPort3D ItemsSource错误指定的Visual已经是另一个Visual的子级或CompositionTarget的根

问题描述

我的WPF应用程序出现问题。

基本上,我要做的是在TabControl的两个不同选项卡中显示相同的ViewPort3D容器。由于我使用的是MVVM模式,因此这些项目已绑定到ViewPort3D ItemsSource。 为此,我在XAML中为Tabs类创建了一个包含ViewPort的DataTemplate。

<Window x:Class="_3DViewPort.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:h="http://helix-toolkit.org/wpf"
        xmlns:viewmodel="clr-namespace:_3DViewPort.viewmodel"
        DataContext="{Binding Main,Source={StaticResource Locator}}">
    
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/MainSkin.xaml" />
                <ResourceDictionary>
                    <DataTemplate DataType="{x:Type viewmodel:Tabs}">
                        <Grid>
                            <Grid.RowDeFinitions>
                                <RowDeFinition />
                                <RowDeFinition Height="25" />
                                <RowDeFinition Height="25" />
                            </Grid.RowDeFinitions>
                            <h:HelixViewport3D  x:Name="viewPort3d"
                                                Grid.Row="0"
                                                ItemsSource="{Binding col}">
                            </h:HelixViewport3D>
                        </Grid>
                    </DataTemplate>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <TabControl ItemsSource="{Binding Path=MyTabs}" />
    </Grid>   
</Window>

在Mainviewmodel中,我声明了Tabs类。此类包含一个ModelVisual3D的ObservableCollection,它将由我的DataTemplate中的ViewPort3D ItemsSource绑定。

using galaSoft.MvvmLight;
using _3DViewPort.Model;
using System.Windows.Media.Media3D;
using System.Windows;
using HelixToolkit.Wpf;
using System;
using System.Collections.ObjectModel;

namespace _3DViewPort.viewmodel
{
    public class Mainviewmodel : viewmodelBase
    {
        private readonly IDataService _dataService;

        public ObservableCollection<Tabs> MyTabs { get; set; }
        
        /// <summary>
        /// Initializes a new instance of the Mainviewmodel class.
        /// </summary>
        public Mainviewmodel(IDataService dataService)
        {
            MyTabs = new ObservableCollection<Tabs>();
            Tabs Tab1 = new Tabs();
            Tabs Tab2 = new Tabs();
            MyTabs.Add(Tab1);
            MyTabs.Add(Tab2);
            
        }    

        
    }
    public class Tabs
    {
        public ObservableCollection<ModelVisual3D> col { get; set; }

        private const string MODEL_PATH = @"C:\Users\User\Source\Repos\3DViewPort\3DViewPort\pikachuThick_tail.stl";

        public Tabs()
        {
                col = new ObservableCollection<ModelVisual3D>();

                ModelVisual3D device3D = new ModelVisual3D();
                device3D.Content = display3d(MODEL_PATH);

                // Add to view port
                col.Add(device3D);

        }

        private Model3D display3d(string model)
        {
            Model3D device = null;
            try
            {
                //Import 3D model file
                ModelImporter import = new ModelImporter();

                //Load the 3D model file
                device = import.Load(model);
            }
            catch (Exception e)
            {
                // Handle exception in case can not file 3D model
                MessageBox.Show("Exception Error : " + e.StackTrace);
            }
            return device;
        }

    }
}

它完全适合第一个选项卡,但是在第二个选项卡上会引发以下错误

ArgumentException: Specified Visual is already a child of another Visual or the root of a CompositionTarget.

我怀疑(根据我在互联网上阅读的内容),它以某种方式重用了相同的ViewPort3D,以再次添加相同的col或将相同的Device3D添加到相同的{{1} }。

由于使用XAML进行调试非常困难,因此我没有找出问题的确切出处。

调用堆栈中(请参阅附件),我没有看到任何代码负责此行为。

您对如何解决此问题有任何建议? 预先非常感谢您的帮助!

请 菲利普

col

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...