wpf - MahApps.Metro 可以在 MvvmCross 中使用吗?
问题描述
我试图在使用 MvvmCross mvvm 框架的 WPF 项目中使用 Mahapps Metro。
两者似乎都使用自定义窗口控件。有没有办法在项目中同时使用两者?
地铁窗口:
<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 窗口:
<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 窗口,应用程序的其余部分就无法设置(即子视图)。有了 MvvmCross 窗口,应用程序照常工作,但没有设计或着色。
解决方案
由于 C# 中不支持多继承,因此不可能开箱即用。
但是看一下MvxWindow的源代码就知道它不是什么大类。因此,一个潜在的解决方案可能是创建您自己的窗口。这个窗口,我们称之为它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
}
}
自定义窗口终于可以这样使用了:
<local:MvxMetroWindow x:Class="TipCalc.WPF.MainWindow"
xmlns:local="clr-namespace:TipCalc.WPF"
...
推荐阅读
- reactjs - 地图组件仅在重新加载时正确显示
- blockchain - 物联网环境中的区块链实施
- python - 熊猫数据框和csv文件之间的内存不匹配
- angular - 我应该如何修改拦截器以便它在后台重试相同的请求
- docker - 使用 docker deamon 连接到 Kubernetes kops pod
- javascript - 在 html 中读取 JSON
- reactjs - 如果 React Native 中没有数据,如何检查平面列表
- mysql - 我使用 MYSQL 中的哪种数据类型仅在数据表中存储数字 1 到 60?
- ios - UICollectionView Horizontal Scroll 左右滑动单元格的位置变化?
- angular - 如何打开组件视图然后从 html 代码中删除按钮标签