MahApps.Metro可以在MvvmCross中使用吗?

Can MahApps.Metro be used in MvvmCross?

我试图在使用 MvvmCross mvvm 框架的 WPF 项目中使用 Mahapps Metro。

两者似乎都使用自定义 window 控件。有没有办法在项目中同时使用两者?

地铁 window:

<mah:MetroWindow  x:Class="TipCalc.WPF.MainWindow"
              xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:local="clr-namespace:TipCalc.WPF"
              xmlns:views="clr-namespace:MvvmCross.Platforms.Wpf.Views;assembly=MvvmCross.Platforms.Wpf"
              mc:Ignorable="d"
              Title="MainWindow"
              Height="450"
              Width="800">
    <Grid>
    </Grid>
</mah:MetroWindow>

MvvmCross Window:

<views:MvxWindow  x:Class="TipCalc.WPF.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:local="clr-namespace:TipCalc.WPF"
              xmlns:views="clr-namespace:MvvmCross.Platforms.Wpf.Views;assembly=MvvmCross.Platforms.Wpf"
              mc:Ignorable="d"
              Title="MainWindow"
              Height="450"
              Width="800">
    <Grid>
    </Grid>
</views:MvxWindow>

应用程序以任一方式运行。但是在 Metro window 到位的情况下,应用程序的其余部分不会设置(即。-children 视图)。有了 MvvmCross window,应用程序照常工作,但没有设计或着色。

由于 C# 中不支持多继承,因此开箱即用是不可能的。

但是看看 MvxWindow 的源代码,发现它并不大 class。因此,一个潜在的解决方案可能是创建您自己的 window。这个 window,我们称它为 MvxMetroWindow,可以通过继承 MetroWindow 来收集这两个功能,另外还添加了 MvxWindow 的所有源代码(从原始源代码复制)你自己。

这看起来像这样:

using System;
using System.Windows;

using MahApps.Metro.Controls;

using MvvmCross;
using MvvmCross.Binding.BindingContext;
using MvvmCross.Platforms.Wpf.Views;
using MvvmCross.ViewModels;
using MvxApplication = MvvmCross.Platforms.Wpf.Views.MvxApplication;

namespace TipCalc.WPF
{
    public class MvxMetroWindow : MetroWindow, IMvxWindow, IMvxWpfView, IDisposable
    {
        private IMvxViewModel _viewModel;
        private IMvxBindingContext _bindingContext;
        private bool _unloaded = false;
        //... Further implemenetation of original MvxWindow
    }
}

自定义window终于可以这样使用了:

<local:MvxMetroWindow x:Class="TipCalc.WPF.MainWindow"
                      xmlns:local="clr-namespace:TipCalc.WPF"
                      ...