lriki / WPFSkeletonIDE

WPF で IDE ライクな UI を持つアプリケーションのスケルトン
MIT License
8 stars 4 forks source link

AvalonDock を 3.0 にアップデートすると異常終了する #1

Open lriki opened 7 years ago

lriki commented 7 years ago

master 取ってきて、パッケージマネージャからアップデートするとすぐ確認できる。

   場所 Xceed.Wpf.AvalonDock.Controls.LayoutItem.get_View()
   場所 Xceed.Wpf.AvalonDock.DockingManager.RemoveViewFromLogicalChild(LayoutContent layoutContent)
   場所 Xceed.Wpf.AvalonDock.DockingManager.DetachDocumentsSource(LayoutRoot layout, IEnumerable documentsSource)
   場所 Xceed.Wpf.AvalonDock.DockingManager.OnLayoutChanged(LayoutRoot oldLayout, LayoutRoot newLayout)
   場所 Xceed.Wpf.AvalonDock.DockingManager.OnLayoutChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   場所 System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   場所 System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   場所 System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   場所 System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   場所 System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
   場所 System.Windows.Baml2006.WpfMemberInvoker.SetValue(Object instance, Object value)
   場所 MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value)
   場所 MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value)
   場所 System.Xaml.XamlObjectWriter.Logic_ApplyPropertyValue(ObjectWriterContext ctx, XamlMember prop, Object value, Boolean onParent)
   場所 System.Xaml.XamlObjectWriter.Logic_DoAssignmentToParentProperty(ObjectWriterContext ctx)
   場所 System.Xaml.XamlObjectWriter.WriteEndObject()
   場所 System.Xaml.XamlWriter.WriteNode(XamlReader reader)
   場所 System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector)
   場所 System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
   場所 System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
   場所 System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
   場所 System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
   場所 WPFSkeletonIDE.Views.MainWindow.InitializeComponent() 場所 C:\Proj\Tech\WPFSkeletonIDE\WPFSkeletonIDE\WPFSkeletonIDE\Views\MainWindow.xaml:行 1
   場所 WPFSkeletonIDE.Views.MainWindow..ctor() 場所 C:\Proj\Tech\WPFSkeletonIDE\WPFSkeletonIDE\WPFSkeletonIDE\Views\MainWindow.xaml.cs:行 34

とりあえず・・・

lriki commented 7 years ago

<!-- 初期レイアウト --> の前に DataContext の設定があると落ちるみたい。

スタックトレースにある DetachDocumentsSource→RemoveViewFromLogicalChild は、3.0 で新しく追加された処理。

レイアウトが更新されたとき (OnUpdateLayout()) に古いビューを削除してなんかいろいろリフレッシュする処理のようだが、アプリ起動直後、初回の呼び出しで DataContext が設定されていると null アクセスする。

・・・なんか AvalonDock のバグのような気もするけど。

↓のように、DataContext のセットを <Window> の一番下に持ってくると動くようになる。

<Window>
    ・・・
    <Window.DataContext>
        <vm:MainWindowViewModel/>
    </Window.DataContext>
</Window>