2015-04-19 26 views
1

是否可以通过使用某些过滤来阻止将一个可锚定元素对接到另一个元素?例如,在viewmodel我可以包含一些属性doctype。对于一个可锚定元素,doctype的值将为“a”,另一个为“b”。我如何使用属性doctype来防止停靠,如果锚定元素的值“a”无法与doctype“b”对接锚定元素?也许,还有其他解决方案。防止对接AvalonDock

+0

对接系统如果不能对接,应该如何反应? – dymanoid

+0

感谢您的提问。我想,应该检查'doctype'在可拖动或停靠事件。我不知道这是如何在AvalonDock工作。 –

回答

0

我在LayoutAnchorableFloatingWindowControl.cs

改变 IOverlayWindowHost.GetDropAreas方法

第一步是intializing的内容的类型。

var floatingWindowContentHost = Content as FloatingWindowContentHost; 
if (floatingWindowContentHost == null) return _dropAreas; 
var rootVisual = floatingWindowContentHost.RootVisual; 
Type type = null; 

var layoutAnchorableFloatingWindow = draggingWindow.Model as LayoutAnchorableFloatingWindow; 
if (layoutAnchorableFloatingWindow != null) 
{ 
    //big part of code for getting type 
    var layoutAnchorablePane = layoutAnchorableFloatingWindow.SinglePane as LayoutAnchorablePane; 

    if (layoutAnchorablePane != null 
     && (layoutAnchorableFloatingWindow.IsSinglePane 
     && layoutAnchorablePane.SelectedContent != null)) 
    { 
     var layoutAnchorable = ((LayoutAnchorablePane)layoutAnchorableFloatingWindow.SinglePane).SelectedContent as LayoutAnchorable; 
     if (layoutAnchorable != null) 
      type = layoutAnchorable.Content; 
    } 
    else 
    { 
     var pane = GetLayoutAnchorablePane(layoutAnchorableFloatingWindow.RootPanel); 
     if (pane == null || pane.SelectedContent == null) 
      return null; 

     var layoutAnchorable = pane.SelectedContent as LayoutAnchorable; 
     if (layoutAnchorable != null) 
      type = layoutAnchorable.Content; 
    } 
} 

此后,我只是比较两种类型,并把需要到_dropAreas

foreach (var areaHost in rootVisual.FindVisualChildren<LayoutAnchorablePaneControl>()) 
{ 
    Type areahostType = null; 
    var layoutAnchorablePane = areaHost.Model as LayoutAnchorablePane; 
    if (layoutAnchorablePane != null && layoutAnchorablePane.SelectedContent != null) 
    { 
     var layoutAnchorable = ((LayoutAnchorablePane)areaHost.Model).SelectedContent as LayoutAnchorable; 
     if (layoutAnchorable != null) 
      areahostType = layoutAnchorable.Content; 
    } 
    // prevent docking different documents 
    if (type != null && areahostType != null && areahostType == type) 
    { 
     _dropAreas.Add(new DropArea<LayoutAnchorablePaneControl>(areaHost, DropAreaType.AnchorablePane)); 
    } 
} 

为了防止对接成文档区域,需要在DockingManager.cs

对于视觉防止DropTargets来做出同样的方法改变需要改变OverlayWindow.cs

0

这是正确的更改IOverlayWindowHost.GetDropAreas,但这一改变对我来说似乎更容易。

我简单的 “LayoutAnchorableFloatingWindowControl.cs” 删除此的foreach:

... 
// Remove this foreach 
foreach (var areaHost in rootVisual.FindVisualChildren<LayoutDocumentPaneControl>()) 
{ 
    _dropAreas.Add(new DropArea<LayoutDocumentPaneControl>(
     areaHost, 
     DropAreaType.DocumentPane)); 
} 

return _dropAreas; 

,并在 “DockingManager.cs” 其他实施必须添加一个其他的原因:

if (!isDraggingDocuments) 
{ 
    _areas.Add(new DropArea<DockingManager>(
     this, 
     DropAreaType.DockingManager)); 

    foreach (var areaHost in this.FindVisualChildren<LayoutAnchorablePaneControl>()) 
    { 
     if (areaHost.Model.Descendents().Any()) 
     { 
      _areas.Add(new DropArea<LayoutAnchorablePaneControl>(
       areaHost, 
       DropAreaType.AnchorablePane)); 
     } 
    } 
} 
// -----> This else is new 
else 
{ 
    foreach (var areaHost in this.FindVisualChildren<LayoutDocumentPaneControl>()) 
    { 
     _areas.Add(new DropArea<LayoutDocumentPaneControl>(
      areaHost, 
      DropAreaType.DocumentPane)); 
    } 

    foreach (var areaHost in this.FindVisualChildren<LayoutDocumentPaneGroupControl>()) 
    { 
     var documentGroupModel = areaHost.Model as LayoutDocumentPaneGroup; 
     if (documentGroupModel.Children.Where(c => c.IsVisible).Count() == 0) 
     { 
      _areas.Add(new DropArea<LayoutDocumentPaneGroupControl>(
       areaHost, 
       DropAreaType.DocumentPaneGroup)); 
     } 
    } 
} 

return _areas; 

所以,如果您不拖动LayoutDocument,则不要将文档窗格控件添加到拖放区域。

这就是它 - 适用于我。