我正在try 将我的应用程序设置为根据设备的名称显示不同的视图.不幸的是,我似乎无法加载View,尽管正在调用ViewModel.我不完全确定我错过了什么.
目前,当应用程序加载时,唯一显示的是主窗口,但没有在其中加载视图.
如何加载视图?
这是我的MainWindow.axaml:
<Window
xmlns="https://github.com/avaloniaui"
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:vm="clr-namespace:TAStagingApp.ViewModels.Implementations;assembly=TAStagingApp.ViewModels"
mc:Ignorable="d"
d:DesignWidth="800"
d:DesignHeight="450"
x:Class="TAStagingApp.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Background="{StaticResource TABackgroundColor}"
Icon="/Assets/tastaging.png"
WindowStartupLocation="CenterScreen"
Title="TA Staging">
<Design.DataContext>
<vm:MainWindowViewModel />
</Design.DataContext>
<Grid>
<ContentPresenter Name="StagingContent"/>
</Grid>
</Window>
和MainWindow.axaml.cs
namespace TAStagingApp.Views;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
public void SetContent(Control control)
{
var mainContent = this.FindControl<ContentPresenter>("StagingContent");
mainContent!.Content = control;
}
}
App.axaml.cs
using AvaloniaApplication = Avalonia.Application;
namespace TAStagingApp;
public partial class App : AvaloniaApplication
{
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}
public override void OnFrameworkInitializationCompleted()
{
var viewModelLoader = new ViewModelLoader(new MainWindow());
ServiceLocator.Initialize(viewModelLoader);
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
DataContext = GetRequiredService<IMainWindowViewModel>();
desktop.MainWindow = new MainWindow
{
DataContext = DataContext,
};
viewModelLoader.LoadContentViewBasedOnComputerName();
}
base.OnFrameworkInitializationCompleted();
}
private static T GetRequiredService<T>() => Locator.Current.GetRequiredService<T>();
}
ViewModelLoader.cs
namespace TAStagingApp.DependencyInjection.Loaders;
public sealed class ViewModelLoader(MainWindow mainWindow) : IViewModelLoader
{
private readonly MainWindow _mainWindow = mainWindow;
public void LoadContentViewBasedOnComputerName()
{
var serviceProvider = DeviceTypeHelper.GetDeviceTypeServiceProvider();
var deviceType = DeviceTypeHelper.GetDeviceType(serviceProvider);
Control contentView = deviceType.Value.ToString() switch
{
var device when device.Equals(DeviceType.Server.ToString()) => new ServerConfigureView(),
var device when device.Equals(DeviceType.Terminal.ToString()) => new TerminalConfigureView(),
var device when device.Equals(DeviceType.Kitchen.ToString()) => new TerminalConfigureView(),
_ => new AdminView()
};
_mainWindow.SetContent(contentView);
}
}
MainWindowViewModel.cs
namespace TAStagingApp.ViewModels.Implementations;
public class MainWindowViewModel : ViewModelBase, IMainWindowViewModel
{
public MainWindowViewModel(IActivateViewModel viewModel)
{
if (viewModel.GetType() == typeof(TerminalConfigureViewModel))
{
TerminalConfigureViewModel = viewModel;
}
else if (viewModel.GetType() == typeof(ServerConfigureViewModel))
{
ServerConfigureViewModel = viewModel;
}
else
{
AdminViewModel = viewModel;
}
Activate(viewModel);
}
public MainWindowViewModel()
{
}
public IActivateViewModel AdminViewModel { get; } = default!;
public IActivateViewModel TerminalConfigureViewModel { get; } = default!;
public IActivateViewModel ServerConfigureViewModel { get; } = default!;
private static void Activate(IActivateViewModel viewModel)
=> viewModel.Activate();
}
我已经看了这两天了,我不知道我错过了什么.
谢谢