В MVVM в WPF ленты В4, с призмой


В эти выходные я был чертовски время, получая в WPF ленты В4 работе с MVVM и Prism (с помощью Unity). После долгих проб и ошибок, я считаю, у меня это работает. Я надеялся, что кто-то мог взглянуть на него и дать мне некоторую обратную связь.

RibbonRegionAdapter.в CS

public class RibbonRegionAdapter : RegionAdapterBase<Ribbon>
{
    private Ribbon _ribbonTarget;

    public RibbonRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory)
        : base(regionBehaviorFactory)
    {

    }

    protected override void Adapt(IRegion region, Ribbon regionTarget)
    {
        _ribbonTarget = regionTarget;

        region.Views.CollectionChanged += delegate {  
            foreach (RibbonTab tab in region.Views.Cast<RibbonTab>())  
            {  
                if (!_ribbonTarget.Items.Contains(tab))  
                {  
                    _ribbonTarget.Items.Add(tab);  
                }  
            }  
        };  
    }

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

Загрузчика.КС - зарегистрироваться в нашей regionAdapter

    protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
    {
        RegionAdapterMappings mappings = base.ConfigureRegionAdapterMappings();

        if (mappings != null)
        {
            mappings.RegisterMapping(typeof(Ribbon), this.Container.Resolve<RibbonRegionAdapter>());
        }


        return mappings;
    }

CarRibbonTab.язык XAML

<ribbon:RibbonTab x:Class="CarManager.Modules.CarModule.Views.CarRibbonTab"
               xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             Header="Officers">
    <ribbon:RibbonGroup Header="New">

    </ribbon:RibbonGroup>
    <ribbon:RibbonGroup Header="Manage">
        <ribbon:RibbonButton Label="Make"
                                LargeImageSource="..\Resources\make.png" />
        <ribbon:RibbonButton Label="Inventory"
                                LargeImageSource="..\Resources\Inventory.png" />
        <ribbon:RibbonButton Label="Assignments" />
    </ribbon:RibbonGroup>
</ribbon:RibbonTab>

CarRibbonTab.СЅ - за кода для просмотра

public partial class CarRibbonTab: RibbonTab
{
    public CarRibbonTab()
    {
        InitializeComponent();
    }
}

Оболочки.язык XAML - просто показать элемент управления ленты

<ribbon:Ribbon DockPanel.Dock="Top" Title="CarManager" prism:RegionManager.RegionName="RibbonRegion">
    <ribbon:Ribbon.ApplicationMenu>
        <ribbon:RibbonApplicationMenu SmallImageSource="Images\Icon.png">
            <ribbon:RibbonApplicationMenuItem Header="Exit"
                                              ImageSource="Images\ExitIcon.png"/>
        </ribbon:RibbonApplicationMenu>
    </ribbon:Ribbon.ApplicationMenu>

</ribbon:Ribbon>

CarModule.КС - регистрации просмотреть с регионом

    public class CarModule: IModule
    {
        private readonly IRegionManager  _regionManager;
        private readonly IUnityContainer _container;
        public MenuItemViewModel MenuItem;

        public CarModule(IUnityContainer container, IRegionManager regionManager)
        {
            _container     = container;
            _regionManager = regionManager;
        }

        public void Initialize()
        {
            //Ribbon
            _container.RegisterType<Object, CarRibbonTab>("CarRibbonTab");

            _regionManager.AddToRegion("RibbonRegion", _container.Resolve<CarRibbonTab>());
        }
    }


11731
19
задан 29 января 2011 в 09:01 Источник Поделиться
Комментарии
2 ответа

Не уверен, что у нас есть много специалистов призмы на проверку кода, и я не работал с ним на некоторое время, так что, возможно, мои высказывания являются неправильными в точках.


  1. Мне не очень нравится, как ты занимаешься области.Вид.Collectionchanged в событие. Данное мероприятие предоставляет много информации в EventArgs В но вы игнорируете это. Во-первых, вам не справиться с удалением взгляды на все. Во-вторых, вместо перебора всех видом каждый раз, когда я хотел использовать те из EventArgs в (NewItems собственность).

  2. Я вообще считаю, что лучше иметь вид изолированного от регионов с точки зрения конкретных типов. Ваше мнение не является единичным, поскольку он должен унаследовать RibbonTab класс. Может быть, это не проблема здесь, и я не уверен, должен ли он быть как-то изменен, это просто выглядит странно для меня.

7
ответ дан 29 января 2011 в 10:01 Источник Поделиться

Одно замечание для тех, кто еще изучает этот вопрос: модули в этом приложении должны быть проекты библиотека пользовательских элементов управления WPF. Просто замените XAML-код в пустой объект UserControl с вкладке @Скотт ленты XAML и показано выше. Нет необходимости, чтобы обернуть RibbonTab объекта в элемент управления UserControl.

В данном конкретном случае, я не разделяю @Snowbear забота о выведении на ленте вкладку " Вид " от RibbonTab управления. Я согласен с его точкой зрения в более общей ситуации, но на вкладке ленты вставка, что мы в ленте не очень красивый вид, как таковой. Другими словами, это не является составным из нескольких различных элементов управления пользовательского интерфейса должен представить ИП или части пользовательского интерфейса. На вкладке ленты является гораздо более конкретным, чем это-это буквально RibbonTab объект-один элемент управления, и он может быть ничем иным.

0
ответ дан 22 февраля 2011 в 08:02 Источник Поделиться