Я использую Caliburn.Micro с Xamarin.Forms для производственного приложения. Однако из-за несовместимости с другими пакетами мне пришлось перейти на netstandard 2.0. Итак, я использую CM версии 4.0.0-alpha.1. Он отлично работает в симуляторе и на устройстве, однако у меня сейчас проблема с отладкой приложения. Отладчик не подключается к устройству, и это происходит только в новой версии, где CM установлен как 4.0.0-alpha.1 (у меня есть открытый вопрос на форумах Xamarin и один здесь по этому поводу, но никто не кажется чтобы понять, что может быть причиной. Попробовал все: очистить, удалить bin-obj, перезагрузить компьютер, устройства, проверить права. Несмотря ни на что, я больше не могу отлаживать свой проект на физических устройствах, хотя он будет работать без подключенного отладчика) .
Итак, я создал новый чистый тестовый проект и установил в него CM 4.0.0-alpha.1. Я просто хочу исключить эту альфа-версию, так или иначе являющуюся виновником (единственное другое отличие от более ранней версии проекта - некоторые дополнительные пакеты стабильного выпуска, которые я установил).
Однако, когда я запускаю эту В тестовом проекте App.xaml.cs выдает 2 исключения в следующей строке:
DisplayRootView<TestViewModel>();
- Ссылка на объект не установлена на экземпляр объекта. После:
- NavigationPage должен иметь Страница root перед использованием. Либо вызовите PushAsyn c с допустимой страницей, либо передайте страницу конструктору перед использованием.
Я нигде не ссылаюсь на NavigationPage. Трассировка стека для сообщения ссылки на пустой объект не показывает ничего полезного. Это очень простой c проект с одним видом / виртуальной машиной. Я считаю, что весь соответствующий код приведен ниже.
Кто-нибудь знает, что может быть причиной ошибки? Возможно, мне не хватает чего-то простого, но я не вижу этого.
Редактировать: я понял, что мне не хватает метода переопределения PrepareViewFirst. Я включил это сейчас. Однако, когда вызывается следующая строка:
container.Instance<INavigationService>(new NavigationPageAdapter(navigationPage));
Выдается следующее исключение:
{System.NullReferenceException: Object reference not set to an instance of an object
at Caliburn.Micro.ContainerExtensions.Instance[TService] (Caliburn.Micro.SimpleContainer container, TService instance) [0x00000] in <8255c5098d75408b9dd3ebb0e98070d2>:0
at TUE.App.PrepareViewFirst (Xamarin.Forms.NavigationPage navigationPage)
AppDelegate.cs:
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
private App _theApp;
private readonly CaliburnAppDelegate appDelegate = new CaliburnAppDelegate();
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
_theApp = IoC.Get<App>();
LoadApplication(_theApp);
return base.FinishedLaunching(app, options);
}
}
App.xaml. cs:
public partial class App : FormsApplication
{
public App()
{
Initialize();
InitializeComponent();
//InitializeComponent();
//MainPage = new MainPage();
}
public App(SimpleContainer container)
{
container
.PerRequest<TestViewModel>();
Initialize();
InitializeComponent();
try
{
//error is thrown here
DisplayRootView<TestViewModel>();
}
catch(Exception ex)
{
System.Diagnostics.Debug.WriteLine("The Error");
}
}
protected override void PrepareViewFirst(NavigationPage navigationPage)
{
try
{
container.Instance<INavigationService>(new NavigationPageAdapter(navigationPage));
}
catch(Exception ex)
{
System.Diagnostics.Debug.WriteLine("Another Error");
}
}
}
CaliburnAppDelegate.cs:
public class CaliburnAppDelegate : CaliburnApplicationDelegate
{
private SimpleContainer container;
public CaliburnAppDelegate()
{
Initialize();
}
protected override void Configure()
{
container = new SimpleContainer();
container.Instance(container);
container.Singleton<App>();
container.Singleton<IEventAggregator, EventAggregator>();
}
protected override void BuildUp(object instance)
{
container.BuildUp(instance);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return container.GetAllInstances(service);
}
protected override object GetInstance(Type service, string key)
{
return container.GetInstance(service, key);
}
protected override IEnumerable<Assembly> SelectAssemblies()
{
return new[]
{
GetType().Assembly,
typeof(TestViewModel).Assembly
};
}
}
TestView.xaml:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TUE.TestView">
<ContentPage.Content>
<Label Text="{Binding WelcomeMessage}"/>
</ContentPage.Content>
</ContentPage>
TestViewModel.cs:
public class TestViewModel : Screen
{
public string WelcomeMessage { get; set; } = "Hello CM";
}