我已經看到了一些像this one這樣的問題,但是我想要使用的對接庫必須有一個重要的特性,它沒有被問到:它必須支持MVVM。支持MVVM的WPF對接庫
因此,在Telerik,DotNetBar,DevZest和其他庫周圍的其他庫(不包括我已經測試過的AvalonDock)中,有沒有實際與MVVM一起使用的庫?
在此先感謝
我已經看到了一些像this one這樣的問題,但是我想要使用的對接庫必須有一個重要的特性,它沒有被問到:它必須支持MVVM。支持MVVM的WPF對接庫
因此,在Telerik,DotNetBar,DevZest和其他庫周圍的其他庫(不包括我已經測試過的AvalonDock)中,有沒有實際與MVVM一起使用的庫?
在此先感謝
您好邁克嘗試這樣的:
使用AvalonDock和實現自定義區域適配器是這樣的:
public class ResizingPanelRegionAdapter : RegionAdapterBase<DockingManager>
{
public ResizingPanelRegionAdapter(IRegionBehaviorFactory factory)
: base(factory)
{
}
protected override IRegion CreateRegion()
{
return new AllActiveRegion();
}
protected override void Adapt(IRegion region, DockingManager regionTarget)
{
region.Views.CollectionChanged += delegate(Object sender, NotifyCollectionChangedEventArgs e)
{
OnViewsCollectionChanged(sender, e, region, regionTarget);
};
}
private void OnViewsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e, IRegion region, DockingManager regionTarget)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (object item in e.NewItems)
{
UIElement view = item as UIElement;
if (view != null)
{
//Get
ResizingPanel resizingPanel = GetResizingPanel(regionTarget.Content);
resizingPanel.Background = Brushes.White;
DocumentPane document = GetDocumentPane(resizingPanel.Children);
//document.Background = Brushes.White;
DocumentContent newContentPane = new DocumentContent();
newContentPane.Content = item;
var itemView = (item as IViewBase);
if (itemView != null)
newContentPane.Title = itemView.Title;
//When contentPane is closed remove the associated region
newContentPane.Closed += (contentPaneSender, args) =>
{
region.Remove(item);
newContentPane.Content = null;
};
document.Items.Add(newContentPane);
if (!resizingPanel.Children.Contains(document))
resizingPanel.Children.Add(document);
regionTarget.Content = resizingPanel;
newContentPane.Activate();
region.Activate(item);
}
}
}
else if (e.Action == NotifyCollectionChangedAction.Remove)
{
}
}
private DocumentPane GetDocumentPane(UIElementCollection collection)
{
foreach (object item in collection)
{
var documentPanel = item as DocumentPane;
if (documentPanel != null)
return documentPanel;
}
return new DocumentPane();
}
private ResizingPanel GetResizingPanel(object content)
{
var resizingPanel = content as ResizingPanel;
if (resizingPanel != null)
return resizingPanel;
return new ResizingPanel();
}
}
和你在你的XAML中可以這樣實現它:
<avalon:DockingManager prism:RegionManager.RegionName="MainRegion">
</avalon:DockingManager>
它是如何工作的? 簡單,首先在所有你必須記住,Region adapters are responsible for creating a region and associating it with the control. This allows you to use the IRegion interface to manage the UI control contents in a consistent way.
所以,下面這個例子中,你可能已經實現Avalon的自定義區域適配器,我在一個項目中此實現獲取工作令人敬畏的結果。
關注
感謝您的回答。不幸的是,我使用CaliburnMicro而不是Prism。我會看看沙發,看看我能不能找到解決辦法 – Mike
AvalonDock應該工作,我知道人們用它與Caliburn Micro。 http://goo.gl/gRVo5 –
@Derek Beattie:不,AvalonDock不是MVVM兼容的。我遇到了很多麻煩,不得不擴展組件。我會盡快寫一篇關於它的博客文章,以便讓任何有需要的開發人員可以使用 – Damascus
是的,我很好奇它是什麼使它不兼容Mvvm,我從未使用它。 –