Примеры/учебники Caliburn Micro и ModernUI

есть ли у кого-нибудь пример или руководство по использованию Caliburn Micro вместе с ModernUi (https://mui.codeplex.com)?


person Matthias    schedule 07.05.2013    source источник
comment
Я полагаю, поскольку ModernUI выглядит как набор элементов управления, вам просто нужно добавить соглашения для каждого элемента управления в наборе инструментов. Единственная разница будет заключаться в том, что CM использует ChildWindow для большей части управления окнами, и вы, вероятно, захотите заменить его на ModernWindow в своей реализации. Я думаю, вам, вероятно, потребуется только предоставить собственную реализацию для WindowManager (и, в частности, для метода EnsureWindow) caliburnmicro.codeplex.com/SourceControl/changeset/view/   -  person Charleh    schedule 07.05.2013
comment
Ну, после просмотра, это выглядит более сложным. Я думаю, что предоставление собственной реализации WindowManager может быть не лучшей идеей, поскольку все всплывающие окна также будут реализовывать класс ModernWindow. Также похоже, что он динамически загружает контент на основе URL-адресов ресурсов, и поэтому подход, основанный на модели представления, вероятно, не сработает.   -  person Charleh    schedule 08.05.2013


Ответы (2)


Итак, я быстро повозился с этим и посмотрел на форумах Mui, и это кажется лучшим подходом:

Поскольку окно загружает содержимое с URL-адресов, вам необходимо использовать подход, основанный на просмотре, а затем найти соответствующую виртуальную машину и связать их.

Лучший способ сделать это — использовать класс ContentLoader, который используется для загрузки содержимого в ModernWindow по запросу. Вы можете просто создать подкласс DefaultContentLoader и предоставить необходимую магию CM для привязки загруженных элементов:

public class ModernContentLoader : DefaultContentLoader
{
    protected override object LoadContent(Uri uri)
    {
        var content = base.LoadContent(uri);

        if (content == null)
            return null;

        // Locate the right viewmodel for this view
        var vm = Caliburn.Micro.ViewModelLocator.LocateForView(content);

        if (vm == null)
            return content;

        // Bind it up with CM magic
        if (content is DependencyObject)
        {
            Caliburn.Micro.ViewModelBinder.Bind(vm, content as DependencyObject, null);
        }

        return content;
    }
}

Ваш загрузчик CM должен просто загрузить модель представления ModernWindow, которая поддерживается представлением на основе ModernWindow (CM пытается использовать EnsureWindow, который создает новый базовый класс окна WPF, если, конечно, ваш элемент управления уже не наследуется от Window, что делает ModernWindow. Если вам нужны все диалоги и всплывающие окна, чтобы быть MUI, вам может потребоваться переопределить WindowManager):

public class Bootstrapper : Bootstrapper<ModernWindowViewModel>
{
}

Который может быть проводником (OneActive) и выглядит так:

public class ModernWindowViewModel : Conductor<IScreen>.Collection.OneActive
{
}

И XAML для представления

ModernWindowView.xaml

<mui:ModernWindow x:Class="WpfApplication4.ViewModels.ModernWindowView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mui="http://firstfloorsoftware.com/ModernUI"
                                     Title="ModernWindowView" Height="300" Width="300" ContentLoader="{StaticResource ModernContentLoader}">   
    <mui:ModernWindow.MenuLinkGroups>
        <mui:LinkGroupCollection>
            <mui:LinkGroup GroupName="Hello" DisplayName="Hello">
                <mui:LinkGroup.Links>
                    <mui:Link Source="/ViewModels/ChildView.xaml" DisplayName="Click me"></mui:Link>
                </mui:LinkGroup.Links>
            </mui:LinkGroup>
        </mui:LinkGroupCollection>
    </mui:ModernWindow.MenuLinkGroups>
</mui:ModernWindow>

Очевидно, вам также нужно сделать загрузчик ресурсом:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />
            <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.Dark.xaml"/>
            <ResourceDictionary>
                <framework:ModernContentLoader x:Key="ModernContentLoader"></framework:ModernContentLoader>
                <wpfApplication4:Bootstrapper x:Key="Bootstrapper"></wpfApplication4:Bootstrapper>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Вот ChildViewModel, который я использую в качестве теста:

public class ChildViewModel : Conductor<IScreen>
{
    public void ClickMe()
    {
        MessageBox.Show("Hello");
    }
}

И XAML для этого (просто кнопка)

<UserControl x:Class="WpfApplication4.ViewModels.ChildView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                                     Height="350" Width="525">
    <Grid>
        <StackPanel>
        <TextBlock >Hello World</TextBlock>
        <Button x:Name="ClickMe" Width="140" Height="50">Hello World</Button>
        </StackPanel>
    </Grid>
</UserControl>

И доказательство концепции:

Пример MUI

person Charleh    schedule 08.05.2013
comment
Привет, Чарле, еще раз спасибо за ваш ответ. Осталась одна проблема: в ContentLoader, когда ViewLocator ищет подходящую модель представления, он всегда возвращает null и Binding не выполняется. Любая идея? - person Matthias; 09.05.2013
comment
Чарле, не могли бы вы загрузить куда-нибудь свой рабочий исходный код? - person Matthias; 09.05.2013
comment
Да, я сделаю это завтра, сейчас время спать! Мой правильно разрешает виртуальную машину, возможно, это связано с вашими пространствами имен, в какое пространство имен вы поместили свое представление/виртуальную машину и как вы их назвали? - person Charleh; 09.05.2013
comment
Я загрузил его на filedropper.com/wpfapplication4. удалил их, и я не уверен, что NuGet получит их автоматически на основе packages.config в каталоге решения... Я использовал Castle.Windsor для IoC - person Charleh; 09.05.2013
comment
Ах, видимо, вы можете использовать nuget install packages.config - person Charleh; 09.05.2013
comment
Argh - но сначала создайте каталог пакетов в каталоге решения, скопируйте в него packages.config из каталога проекта и запустите его оттуда, иначе он выгрузит их все в каталог вашего проекта! - person Charleh; 09.05.2013
comment
Чарле, большое спасибо. Должно быть, были какие-то проблемы с Каслом. Теперь это просто работает. - person Matthias; 09.05.2013
comment
Дополнительная информация о NuGet здесь, которую я не знал (если это поможет) stackoverflow.com/questions/6876732/ - не знал вы можете просто восстановить пакет в VS - person Charleh; 09.05.2013
comment
По словам @AlexJustin, ссылка с загруженным приложением мертва. Он попросил вас перезалить его, если можно, на новый хост? - person Ren; 14.05.2013
comment
Попробуй еще раз, я только что перезалил на то же место - person Charleh; 14.05.2013
comment
@Charleh, отличная инструкция, спасибо! Но я не могу понять, как открывать новые всплывающие окна, используя эту комбинацию. Я попытался изменить WindowManager, как показано здесь, но безуспешно. Можешь помочь? - person AsValeO; 15.03.2015
comment
Поскольку я понимаю, что для достижения цели мне нужно каким-то образом импортировать существующий WindowManager в ChildViewModel, а затем использовать его для открытия нового окна. - person AsValeO; 15.03.2015
comment
Привет, ValeO, не могли бы вы задать это как новый вопрос на SO? Таким образом, я могу помочь, не загрязняя этот существующий вопрос. Суть в том, что вам, вероятно, потребуется повторно реализовать WindowManager и зарегистрировать свой собственный оконный менеджер в качестве реализации для службы IWindowManager. Это WindowManager будет использовать MordernWindow вместо окон по умолчанию. - person Charleh; 16.03.2015
comment
Чарле, взгляните здесь, пожалуйста. Обязательно нужна ваша помощь. - person AsValeO; 16.03.2015
comment
Привет, Чарле, не могли бы вы загрузить свое приложение еще раз. У меня такая же проблема с нулевой ссылкой в ​​ContentLoader. Спасибо в совете. - person PaulWebbster; 28.04.2015

Я создаю очень, очень простой пример приложения для чата, используя Modern UI для WPF, Caliburn Micro и MEF.

https://github.com/gblmarquez/mui-sample-chat

Я надеюсь, что это помогает

person gblmarquez    schedule 09.05.2013