Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

Bartek Szafko

O wstążce w pryzmacie (Ribbon + Prism)

Wstążka (Ribbon)

Jakiś czas temu Micorosoft opublikował biblioteki ze wstążką znane z Office 2007 pozwalające na użycie w aplikacjach WPF. Okazuje się, że uzyskanie tych bibliotek wymaga jednak trochę zachodu:

  1. Trzeba się udać na stronę “Office UI Licensing” i skorzystać z linku “License the Office UI”, następnie trzeba się zalogować przy pomocy live Id i zaakceptować licencję. Przyznam się szczerze, że nawet nie wiem na co się zgodziłem :P Na końcu tego kroku będzie można pobrać WPFRibbonCTP – bibliotekę ze wstążką dla WPF.
  2. Najlepiej też pobrać Hands-On-Lab:What’s Coming in WPF: Datagrid, Ribbon, and VSM, który pokazuje jak stworzyć wstążkę. W ćwiczeniu 2 zawarta jest świetna aplikacja demonstracyjna:

image

Podłączamy Prism

O Prism opowiadał Szymon Kobalczyk na 12. spotkaniu PG .NET – jego wystąpienie zainspirowało mnie i zachęciło do eksperymentów. Postanowiłem dodać region pozwalający na dodawanie zakładek do wstążki przez moduły. Po bliższym obejrzeniu kodu źródłowego Prisma okazało się, że trzeba tylko stworzyć własny RegionAdapter:

    public class RibbonControlRegionAdapter : RegionAdapterBase
    {
        private Ribbon m_regionTarget;

        protected override void Adapt(IRegion region, Ribbon regionTarget)
        {
            m_regionTarget = regionTarget;
            regionTarget.Tabs.Clear();
            region.ActiveViews.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(OnActiveViewsChanged);
            foreach ( RibbonTab v in region.ActiveViews)
                regionTarget.Tabs.Add(v);
        }

        private void OnActiveViewsChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            switch (e.Action)
            {
                case NotifyCollectionChangedAction.Add:
                    foreach (RibbonTab v in e.NewItems)
                        m_regionTarget.Tabs.Add(v);
                    break;

                case NotifyCollectionChangedAction.Remove:
                    foreach (RibbonTab v in e.NewItems)
                        m_regionTarget.Tabs.Remove(v);
                    break;

            }
        }

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

Tak wygląda shell przed podłączeniem modułu ( wiem – brzydki, ale nie o to chodzi:P ):

image

A tak po włączeniu modułu Module1, który używa regionu we wstążce:

image

Rozwój

W tym przykładzie adapter jest tak zbudowany, że pozwala tylko na dodawanie całych zakładek. Można sobie wyobrazić sytuację, w której na istniejących już zakładkach można dodawać nowe przyciski/grupy/menu lub nawet nowe pozycje do głównego menu.
Inne podobne artykuły:

Bartek SzafkoTen artykuł pochodzi z bloga Bartka Szafko
Opublikowane 24 listopada 2008 08:50 przez bszafko
Filed under:

Komentarze:

 

arkadiusz.wasniewski said:

Ha. Bardzo ciekawe...

listopada 24, 2008 14:13
 

bszafko said:

oczywiście powinno być:

public class RibbonControlRegionAdapter : RegionAdapterBase<Ribbon>

listopada 24, 2008 15:50
Komentarze anonimowe wyłączone
W oparciu o Community Server (Personal Edition), Telligent Systems