Примеры и учебные пособия Caliburn Micro и ModernUI - программирование

Примеры и учебные пособия Caliburn Micro и ModernUI

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

4b9b3361

Ответ 1

Хорошо, так что я быстро общался с ним и смотрел на форумах 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 Example

Ответ 2

Я создаю очень простой пример чата с использованием современного интерфейса для WPF, Caliburn Micro и MEF.

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

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