【发布时间】: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是什么?