Caliburn Micro和ModernUI示例/教程

时间:2013-05-07 14:27:33

标签: c# caliburn.micro modern-ui

有没有人有关于如何将Caliburn Micro与ModernUi(https://mui.codeplex.com)一起使用的示例或教程?

2 个答案:

答案 0 :(得分:21)

好的,所以我快速搞砸了它,看看Mui论坛,这似乎是最好的方法:

由于窗口从URL加载内容,您需要采用视图优先方法,然后找到适当的VM并绑定两者。

执行此操作的最佳方式似乎是通过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

答案 1 :(得分:8)

我使用适用于WPF,Caliburn Micro和MEF的Modern UI创建了一个非常非常简单的聊天应用程序示例。

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

我希望它有所帮助