2009-12-09 45 views
1

棱鏡文檔指出有三種可用區域適配器:如何在棱鏡中使用Panel作爲區域?

ContentControlRegionAdapter。此適配器適應類型System.Windows.Controls.ContentControl和派生類的控件。

SelectorRegionAdapter。此適配器適用於從類System.Windows.Controls.Primitives.Selector派生的控件,例如System.Windows.Controls.TabControl控件。

ItemsControlRegionAdapter。此適配器適應類型System.Windows.Controls.ItemsControl和派生類的控件。

不幸的是,Panel不屬於任何類別的,我希望能夠在我的.xaml.cs寫這篇文章:

<Canvas cal:RegionManager.RegionName="{x:Static local:RegionNames.MainCanvas}"> 

我們怎樣才能做到這一點?

+0

這裏的問題是,在畫布不強加任何佈局。除非讓你的regionadapter更加智能化地註冊該區域的元素(這也是爲什麼不支持Panel),否則你將遇到問題。我很好奇......你有什麼應用程序? – 2009-12-10 01:50:53

+0

我正在更新具有浮動控制容器(如工具欄)的預期位於Canvas內的現有代碼庫。他們處理他們自己的「標題欄」區域並在拖動時更新他們的畫布位置。顯然,這可以通過其他方式來完成,但是與往常一樣,時間是關鍵,這似乎是我能夠將現有結構轉換爲與Prism一起工作的最快方式。 – Jedidja 2009-12-10 13:40:52

+0

讓控制更新其位置似乎有點不合邏輯......有點像「走出你的箱子」。 +1可以轉換現有的代碼庫。 – 2009-12-10 15:13:00

回答

2

對此的答案可以在這個非常好的descriptive blog post中找到。

但是,我想要的答案存儲在StackOverflow以及:)它花了一些搜索從谷歌得到這個。這是我的代碼與基本面板一起使用。

第1步 - 創建一個新的區域適配器

public class PanelHostRegionAdapter : RegionAdapterBase<Panel> 
{ 
    public PanelHostRegionAdapter(IRegionBehaviorFactory behaviorFactory) 
     : base(behaviorFactory) 
    { 
    } 

    protected override void Adapt(IRegion region, Panel regionTarget) 
    { 
     region.Views.CollectionChanged += (s, e) => 
       { 
        if (e.Action == NotifyCollectionChangedAction.Add) 
        { 
         foreach (FrameworkElement element in e.NewItems) 
         { 
          regionTarget.Children.Add(element); 
         } 
        } 
        else if (e.Action == NotifyCollectionChangedAction.Remove) 
        { 
         foreach (FrameworkElement CurrentElement in e.OldItems) 
          regionTarget.Children.Remove(CurrentElement); 
        } 
       }; 
    } 

    protected override IRegion CreateRegion() 
    { 
     return new AllActiveRegion(); 
    } 
} 

第2步 - 更新您的引導程序

public class Bootstrapper : UnityBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     ... 
    } 

    protected override IModuleCatalog GetModuleCatalog() 
    { 
     ... 
    } 

    protected override RegionAdapterMappings ConfigureRegionAdapterMappings() 
    { 
     RegionAdapterMappings Mappings = base.ConfigureRegionAdapterMappings(); 
     Mappings.RegisterMapping(typeof(Panel), Container.Resolve<PanelHostRegionAdapter>()); 
     return Mappings; 
    } 
}