WinPhone 8.1 проект с Xamarin.Forms и Caliburn.Micro не удается создать представление
У меня есть проект Xamarin.Forms с проектом WinPhone 8.1, который использует Caliburn.Micro.
Это мой App.xaml:
<caliburn:CaliburnApplication x:Class="MyProject.WinPhone.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:caliburn="using:Caliburn.Micro"
xmlns:local="using:MyProject.WinPhone" />
Это мой App.xaml.cs:
public sealed partial class App : Caliburn.Micro.CaliburnApplication
{
private WinRTContainer container;
private TransitionCollection transitions;
public App()
{
InitializeComponent();
}
protected override void Configure()
{
container = new WinRTContainer();
container.RegisterWinRTServices();
//TODO: Register your view models at the container
container.PerRequest<MainViewModel>();
}
protected override object GetInstance(Type service, string key)
{
var instance = container.GetInstance(service, key);
if (instance != null)
return instance;
throw new Exception("Could not locate any instances.");
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
container.BuildUp(instance);
}
protected override void PrepareViewFirst(Frame rootFrame)
{
container.RegisterNavigationService(rootFrame);
}
protected override IEnumerable<Assembly> SelectAssemblies()
{
return new[] { typeof(MainViewModel).GetTypeInfo().Assembly, typeof(Windows.Foundation.AsyncActionCompletedHandler).GetTypeInfo().Assembly };
}
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
if (args.PreviousExecutionState == ApplicationExecutionState.Running)
return;
try
{
DisplayRootView<MainView>();
//DisplayRootView<MainPage>();
//DisplayRootViewFor<MainViewModel>();
}
catch (Exception ex)
{
var x = 8;
throw;
}
}
}
Это пакеты NuGet:
Он компилируется, но когда я пытаюсь запустить его, я получаю следующее исключение в DisplayRootView
:
Не удалось найти тип среды выполнения Windows "Windows.Foundation". ":" Windows.Foundation
at System.StubHelpers.WinRTTypeNameConverter.GetTypeFromWinRTTypeName(String typeName, Boolean& isPrimitive)
at System.StubHelpers.SystemTypeMarshaler.ConvertToManaged(TypeNameNative* pNativeType, Type& managedType)
at Windows.UI.Xaml.Controls.Frame.Navigate(Type sourcePageType, Object parameter)
at Caliburn.Micro.CaliburnApplication.DisplayRootView(Type viewType, Object paramter)
at Caliburn.Micro.CaliburnApplication.DisplayRootView[T](Object parameter)
at MyProject.WinPhone.App.OnLaunched(LaunchActivatedEventArgs args)
Можете ли вы сказать мне, что я должен делать с этим?
ОБНОВИТЬ:
Корень проблемы лежит в этой части кода:
private global::MyProject.WinPhone.MyProject_WinPhone_XamlTypeInfo.XamlTypeInfoProvider _provider;
public global::Windows.UI.Xaml.Markup.IXamlType GetXamlType(global::System.Type type)
{
if(_provider == null)
{
_provider = new global::MyProject.WinPhone.MyProject_WinPhone_XamlTypeInfo.XamlTypeInfoProvider();
}
return _provider.GetXamlTypeByType(type);
}
public global::Windows.UI.Xaml.Markup.IXamlType GetXamlType(string fullName)
{
if(_provider == null)
{
_provider = new global::MyProject.WinPhone.MyProject_WinPhone_XamlTypeInfo.XamlTypeInfoProvider();
}
return _provider.GetXamlTypeByName(fullName);
}
public global::Windows.UI.Xaml.Markup.XmlnsDefinition[] GetXmlnsDefinitions()
{
return new global::Windows.UI.Xaml.Markup.XmlnsDefinition[0];
}
}
}
namespace MyProject.WinPhone.MyProject_WinPhone_XamlTypeInfo
{
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks", "4.0.0.0")]
internal partial class XamlTypeInfoProvider
{
public global::Windows.UI.Xaml.Markup.IXamlType GetXamlTypeByType(global::System.Type type)
{
global::Windows.UI.Xaml.Markup.IXamlType xamlType;
if (_xamlTypeCacheByType.TryGetValue(type, out xamlType))
{
return xamlType;
}
int typeIndex = LookupTypeIndexByType(type);
if(typeIndex != -1)
{
xamlType = CreateXamlType(typeIndex);
}
var userXamlType = xamlType as global::MyProject.WinPhone.MyProject_WinPhone_XamlTypeInfo.XamlUserType;
if(xamlType == null || (userXamlType != null && userXamlType.IsReturnTypeStub && !userXamlType.IsLocalType))
{
global::Windows.UI.Xaml.Markup.IXamlType libXamlType = CheckOtherMetadataProvidersForType(type);
if (libXamlType != null)
{
if(libXamlType.IsConstructible || xamlType == null)
{
xamlType = libXamlType;
}
}
}
if (xamlType != null)
{
_xamlTypeCacheByName.Add(xamlType.FullName, xamlType);
_xamlTypeCacheByType.Add(xamlType.UnderlyingType, xamlType);
}
return xamlType;
}
Кажется, что мой входящий MainView не может быть преобразован в соответствующий тип XAML, так как GetXamlTypeByType
возвращает ноль.
Мне кажется, что представление Xamarin.Forms несовместимо с миром WinPhone... ну, Xamarin.Forms должны относиться к абстрактным представлениям, если я правильно помню.
Что мне теперь делать?
1 ответ
После того, как я внимательно прочитал в учебнике по Xamarin Forms, как приложение Windows Phone 8.1 добавляется и изменяется соответствующим образом, все работает как положено.
В моем случае MainPage.xaml.cs имеет свой оригинальный код, поскольку я не менял его в соответствии с руководством.
public sealed partial class MainPage // REMOVE ": PhonePage"
Поскольку Caliburn.Micro использует инфраструктуру Xamarin, эти шаги являются обязательными.