2013-08-21 6 views
5

मैं एक WPF प्रोजेक्ट में एमवीवीएम के साथ एवलॉन डॉक का उपयोग करता हूं।डब्ल्यूपीएफ - एवलॉन डॉक - समापन दस्तावेज़

जब मैंने "एक्स" (टैब का बंद बटन) मारा तो मेरा दस्तावेज़ बंद हो गया लेकिन स्मृति में रहता है। ऐसा लगता है कि यह केवल छिपा हुआ है। इसे मेरे Model.Documents संग्रह से हटाया नहीं गया है।

यदि मैं DockingManager_DocumentClosing जोड़ता हूं और संग्रह से अपना दस्तावेज़ निकालने का प्रयास करता हूं, तो मुझे Xceed.Wpf.AvalonDock.Layout.LayoutContent की निम्न विधि में अपवाद प्राप्त होता है क्योंकि parentAsContainer शून्य है।

/// <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 से हटाया जा सकता अंततः निपटारा किया जा करने के लिए जब मैं अपने Close बटन हिट प्रबंधन कर सकते हैं पता है?

संदर्भ के लिए:

<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> 

उत्तर

2

मैं वास्तव में एक अस्वीकार्य वैकल्पिक हल खोजने के: यह AvalonDock की मेरी XAML है। यह वास्तव में मुड़ गया है।

मैं केवल संदर्भ के रूप में देता हूं। ऐसा करने का एक साफ तरीका होना चाहिए।

// ************************************************************************ 
    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); 
     } 
    } 
+0

यदि आप एमवीवीएम का उपयोग नहीं कर रहे हैं तो इसे ठीक करने का कोई तरीका है? –

+0

मुझे नहीं पता ??? (देरी के लिए खेद है ... मैंने अभी आपका प्रश्न देखा है) –

+0

यह एक लंबा शॉट है, लेकिन इस घटना को कभी मेरे लिए नहीं बुलाया जाता है, क्या किसी और के पास ऐसा ही अनुभव होता है? –

-1

IsVisibleChanged के लिए रजिस्टर करें।

void layoutFPR_Hidden(object sender, EventArgs e) 
{ 
    LayoutAnchorable window = (LayoutAnchorable)sender; 
    YourClass content = window.Content as YourClass; 

    // Close the object 
    content = null; 
    ((LayoutAnchorable)sender).Close(); 

} 
0

मैंने पाया कि एक LayoutDocument या एक LayoutAnchorablePane, दोनों इस सेटिंग को लागू करने पर काम करता है है: CanClose="False" या CanFloat="False"

यह बंद करें बटन को हटा देता है।

<avalonDock:LayoutDocument Title="Board" 
          ContentId="Board" 
          CanClose="False" 
          CanFloat="False"> 
</avalonDock:LayoutDocument> 
संबंधित मुद्दे