【问题标题】:Caliburn Micro and ModernUI Examples/TutorialsCaliburn Micro 和 ModernUI 示例/教程
【发布时间】:2013-05-01 13:21:16
【问题描述】:

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

【问题讨论】:

  • 我想,因为 ModernUI 看起来像一个控件集合,您只需要为工具包中的每个控件添加约定即可。唯一的区别是 CM 使用 ChildWindow 进行大部分窗口管理,您可能希望在实现中将其替换为 ModernWindow。我认为您可能只需要为 WindowManager 提供自己的实现(特别是 EnsureWindow 方法)caliburnmicro.codeplex.com/SourceControl/changeset/view/…
  • 嗯,看过之后,看起来比这更复杂。我认为提供您自己的 WindowManager 实现可能不是最好的主意,因为所有弹出窗口也会实现 ModernWindow 类。此外,它看起来像是根据资源 URL 动态加载内容,因此视图模型优先的方法可能不起作用。

标签: c# caliburn.micro modern-ui


【解决方案1】:

好的,所以我很快就搞砸了,并查看了 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 类,除非您的控件当然已经从 @ 继承987654330@ 与 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>

以及概念证明:

【讨论】:

  • 嘿,Charleh,再次感谢您的回答。还有一个问题:在 ContentLoader 中,ViewLocator 在寻找匹配的 viewmodel 时,总是返回 null,并且没有完成任何 Binding。有什么想法吗?
  • Charleh,你能把你的工作示例源上传到某个地方吗?
  • 是的,我明天就做,现在该睡觉了!我的正确解析了虚拟机,可能与您的命名空间有关,您将视图/虚拟机放入哪个命名空间以及您将它们都称为什么?
  • 再试一次,我刚刚重新上传到同一个地方
  • @Charleh,很好的指导,谢谢!但我不知道如何使用这种组合打开新的弹出窗口。我尝试修改 WindowManager,如 here 所示,但没有成功。你能帮忙吗?
【解决方案2】:

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

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

希望对你有帮助

【讨论】:

  • 如何使用命令导航?我收到一个错误:当我使用 Command="mui:LinkCommands.NavigateLink" 时。错误是“Windows Presentation Foundation (WPF) 项目不支持 LinkCommands。”
  • 连 BBCodeBlock URL 都没有显示 URL
猜你喜欢
  • 2023-03-16
  • 2012-01-29
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 2014-06-29
  • 1970-01-01
相关资源
最近更新 更多