【问题标题】:wpf 'System.Windows.Controls.ContentControl.Content' threw an exception. Specified element is already the logical child of another elementwpf 'System.Windows.Controls.ContentControl.Content' 抛出异常。指定元素已经是另一个元素的逻辑子元素
【发布时间】:2017-01-24 06:55:59
【问题描述】:

我有一个用于播放视频然后导航到另一个屏幕的 WPF 应用程序。该应用程序首先播放视频,然后导航到 page2.xaml 并再次导航到视频页面,我得到以下异常。

我的 xaml 看起来像这样:

<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="MainGrid">     
  <ContentControl x:Name="cntctrl" Content="{Binding VlcObject}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</Grid>

VlcObject 是 Vlc.DotNet.Wpf.VlcControl 的一个实例,我注意到 VlcObject.MediaPlayer 在导航到第二页时被处理。所以在导航到视频页面时,我正在创建一个新的 VlcObject 实例。 我的 ViewModel 如下所示:

    private Vlc.DotNet.Wpf.VlcControl _vlcObject = null;
    public Vlc.DotNet.Wpf.VlcControl VlcObject
    {
        get { return _vlcObject; }
        set { Set(nameof(VlcObject), ref _vlcObject, value); }
    }
    private void InitialiseVLC()
    {
        if (VlcObject == null || VlcObject.MediaPlayer.IsDisposed)
        {
            DispatcherHelper.CheckBeginInvokeOnUI(() =>
            {
                VlcObject = null;
                VlcObject = new Vlc.DotNet.Wpf.VlcControl();
                VlcObject.MediaPlayer.VlcLibDirectoryNeeded += MediaPlayer_VlcLibDirectoryNeeded;
                VlcObject.MediaPlayer.EndInit();
                VlcObject.MediaPlayer.Opening += MediaPlayer_Opening;
                VlcObject.MediaPlayer.EndReached += MediaPlayer_EndReached;
                VlcObject.MediaPlayer.EncounteredError += MediaPlayer_EncounteredError;
                VlcObject.MediaPlayer.Disposed += MediaPlayer_Disposed;
            });
        }
    }
    private void MediaPlayer_Disposed(object sender, EventArgs e)
    {
        Logger.LogInfo("Media Player is disposed.");
        DispatcherHelper.CheckBeginInvokeOnUI(() =>
        {
            try
            {
                VlcObject.MediaPlayer.VlcLibDirectoryNeeded -= MediaPlayer_VlcLibDirectoryNeeded;
                VlcObject.MediaPlayer.Opening -= MediaPlayer_Opening;
                VlcObject.MediaPlayer.EndReached -= MediaPlayer_EndReached;
                VlcObject.MediaPlayer.EncounteredError -= MediaPlayer_EncounteredError;
                VlcObject.MediaPlayer.Disposed -= MediaPlayer_Disposed;
                //VlcObject = null;

            }
            catch (Exception ex)
            {
                Logger.LogError("Error while disposing MediaPlayer: ");
                Logger.LogError(ex);
            }
        });
    }
    public void OnNavigatedTo(object parameter, bool isBack = false)
    {            
            InitializeVLC();
    }

这是我得到的例外:

System.Windows.Markup.XamlParseException:设置属性“System.Windows.Controls.ContentControl.Content”引发异常。 ---> System.InvalidOperationException:指定元素已经是另一个元素的逻辑子元素。先断开它。在 System.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject 新父母)在 System.Windows.FrameworkElement.AddLogicalChild(对象子)在 System.Windows.Controls.ContentControl.OnContentChanged(对象 旧内容,对象新内容)在 System.Windows.Controls.ContentControl.OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 在 System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs 吃 System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs 吃 System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs 参数)在 System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex,DependencyProperty dp,PropertyMetadata 元数据, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference,布尔 coerceWithCurrentValue, 操作类型操作类型)在 System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, 对象值、PropertyMetadata 元数据、布尔值 coerceWithDeferredReference,布尔 coerceWithCurrentValue, OperationType operationType, Boolean isInternal) at System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(对象 实例,对象值)在 MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember 成员, 对象 obj,对象值)在 MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(对象实例, XamlMember 属性,对象值)--- 内部异常堆栈结束 跟踪---在 System.Windows.Markup.XamlReader.RewrapException(异常 e, IXamlLineInfo lineInfo, Uri baseUri) 在 System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory,布尔值 skipJournaledProperties、对象 rootObject、XamlObjectWriterSettings 设置,Uri baseUri)在 System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, 布尔型 skipJournaledProperties、对象 rootObject、XamlAccessLevel accessLevel, Uri baseUri) 在 System.Windows.Markup.XamlReader.LoadBaml(流流,ParserContext parserContext, Object parent, Boolean closeStream) at System.Windows.Application.LoadBamlStreamWithSyncInfo(流流, ParserContext pc) 在 MS.Internal.AppModel.AppModelKnownContentFactory.BamlConverter(流 流,Uri baseUri,布尔值 canUseTopLevelBrowser,布尔值 sandboxExternalContent,布尔值 allowAsync,布尔值 isJournalNavigation、XamlReader 和 asyncObjectConverter)在 MS.Internal.AppModel.MimeObjectFactory.GetObjectAndCloseStream(流 s, ContentType contentType, Uri baseUri, Boolean canUseTopLevelBrowser, Boolean 沙箱ExternalContent, Boolean allowAsync, Boolean isJournalNavigation, XamlReader& asyncObjectConverter) 在 System.Windows.Navigation.NavigationService.GetObjectFromResponse(WebRequest 请求、WebResponse 响应、Uri destinationUri、对象 navState)
在 System.Windows.Navigation.NavigationService.DoNavigate(Uri 源, NavigationMode f,对象导航状态)在 System.Windows.Navigation.NavigateQueueItem.Dispatch(Object obj) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托 回调,对象参数,Int32 numArgs)在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象 源,委托方法,对象参数,Int32 numArgs,委托 catchHandler)

谁能帮帮我。

【问题讨论】:

  • VlcObject 是什么?

标签: c# wpf xaml


【解决方案1】:

“先断开连接”。错误消息的一部分是这里的关键。由于您正在绑定内容,因此听起来相同的绑定在另一个控件(或页面)上处于活动状态。您应该尽量确保内容不会绑定到多个控件。页面是否共享相同的视图模型?您可以尝试为每个页面创建一个唯一的视图模型,并为每个视图模型提供一个唯一的内容包装器。

【讨论】:

  • VlcObject 只绑定到一个控件,即 ContentControl,而且我只有一个视图绑定到 thisViewModel。 VlcObject 是 Vlc.DotNet.Wpf.VlcControl 的一个实例,我注意到 VlcObject.MediaPlayer 正在导航到第二页。所以在导航到视频页面时,我正在创建一个 VlcObject 的新实例。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2012-08-23
    • 2011-04-30
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多