c# – WPF – AvalonDock – 结账凭证
发布时间:2020-12-15 05:39:35 所属栏目:百科 来源:网络整理
导读:我在 WPF项目中使用AvalonDock和MVVM. 当我点击“X”(选项卡的关闭按钮)时,我的文档关闭但保留在内存中.它似乎只是隐藏的.它不会从我的Model.Documents集合中删除. 如果我添加DockingManager_DocumentClosing并尝试从集合中删除我的文档,我会在Xceed.Wpf.Ava
我在
WPF项目中使用AvalonDock和MVVM.
当我点击“X”(选项卡的关闭按钮)时,我的文档关闭但保留在内存中.它似乎只是隐藏的.它不会从我的Model.Documents集合中删除. 如果我添加DockingManager_DocumentClosing并尝试从集合中删除我的文档,我会在Xceed.Wpf.AvalonDock.Layout.LayoutContent的以下方法中收到一个Exception,因为parentAsContainer为null. /// <summary> /// Close the content /// </summary> /// <remarks>Please note that usually the anchorable is only hidden (not closed). By default when user click the X button it only hides the content.</remarks> public void Close() { var root = Root; var parentAsContainer = Parent as ILayoutContainer; parentAsContainer.RemoveChild(this); if (root != null) root.CollectGarbage(); OnClosed(); } 有没有人知道我如何管理AvalonDock中可以从我的Model.Documents中删除的文件,以便在我点击其关闭按钮时最终被处理掉? 供参考:这是我的AvalonDock的XAML: <avalonDock:DockingManager x:Name="DockingManager" DocumentsSource="{Binding DocumentItems}" ActiveContent="{Binding ActiveMainWindowViewModel,Converter={StaticResource RestrictedClassConverter},ConverterParameter={x:Type multiSimAnalysis:MainWindowViewModel},Mode=TwoWay}" DocumentClosing="DockingManager_DocumentClosing" ActiveContentChanged="DockingManager_ActiveContentChanged"> <avalonDock:DockingManager.LayoutItemContainerStyleSelector> <pane:PanesStyleSelector> <pane:PanesStyleSelector.MainWindowViewLcStyle> <Style TargetType="{x:Type avalonDock:LayoutItem}"> <Setter Property="Title" Value="{Binding Model.Title}"/> <Setter Property="ToolTip" Value="{Binding Model.Title}"/> <Setter Property="CloseCommand" Value="{Binding Model.CloseCommand}"/> <Setter Property="IconSource" Value="{Binding Model.IconSource}"/> <Setter Property="IsSelected" Value="{Binding Model.IsSelected,Mode=TwoWay}"/> <Setter Property="IsActive" Value="{Binding Model.IsActive,Mode=TwoWay}"/> <Setter Property="ContentId" Value="{Binding Model.ContentId}"/> </Style> </pane:PanesStyleSelector.MainWindowViewLcStyle> </pane:PanesStyleSelector> </avalonDock:DockingManager.LayoutItemContainerStyleSelector> <avalonDock:DockingManager.LayoutItemTemplateSelector> <multiSimAnalysis:PanesTemplateSelector> <multiSimAnalysis:PanesTemplateSelector.MainWindowLcTemplate> <DataTemplate> <multiSimAnalysis:MainWindowViewLc /> </DataTemplate> </multiSimAnalysis:PanesTemplateSelector.MainWindowLcTemplate> </multiSimAnalysis:PanesTemplateSelector> </avalonDock:DockingManager.LayoutItemTemplateSelector> <avalonDock:DockingManager.Theme> <avalonDock:VS2010Theme/> </avalonDock:DockingManager.Theme> <avalonDock:LayoutRoot> <avalonDock:LayoutPanel Orientation="Horizontal"> <avalonDock:LayoutAnchorablePane DockWidth="400"> <avalonDock:LayoutAnchorable Title="Scope(s) selection" x:Name="PanelScopeSelection" IsVisible="True"> <scopeSelection:UserControlSelectStudyScope x:Name="ToolScopeSelection"/> </avalonDock:LayoutAnchorable> </avalonDock:LayoutAnchorablePane> <avalonDock:LayoutDocumentPane/> <avalonDock:LayoutAnchorablePane DockWidth="150"> <avalonDock:LayoutAnchorable Title="Properties" x:Name="PanelScopePropertyGrid"> <!--<multiSimAnalysis:UserControlPropertyGrid x:Name="ToolPropertyGrid" />--> <xctk:PropertyGrid x:Name="ToolPropertyGrid" SelectedObject="{Binding ActiveObject}" /> </avalonDock:LayoutAnchorable> </avalonDock:LayoutAnchorablePane> </avalonDock:LayoutPanel> </avalonDock:LayoutRoot> </avalonDock:DockingManager> 解决方法
我实际上找到了一个不可接受的解决方法.
真是扭曲了. 我只是作为参考.应该有一个干净的方法来做到这一点. // ************************************************************************ private void DockingManager_DocumentClosing(object sender,Xceed.Wpf.AvalonDock.DocumentClosingEventArgs e) { e.Document.CanClose = false; DocumentModel documentModel = e.Document.Content as DocumentModel; if (documentModel != null) { Dispatcher.BeginInvoke(new Action(() => this.Model.DocumentItems.Remove(documentModel)),DispatcherPriority.Background); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |