如何解决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 举报,一经查实,本站将立刻删除。