Вот мой первый вопрос на stackoverflow.com.
Я часами пытаюсь создать Объединенный словарь в формах Xamarin (хотя впервые).
Я следую следующие учебные пособия / документация: https://jmillerdev.net/creating-a-xamarin-forms-theme-assembly/
и https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/resource-dictionaries.
Мои шаги:
- Создать новое приложение «Мобильное приложение (Xamarin.Forms)» под названием «TestApp2».
- Создайте новую страницу XAML ContentPage (MyDic.xaml), переименуйте
<ContentPage>
в <ResourceDictionary>
и поместите в простой стиль.
- Изменен MyDic.xaml.cs, чтобы файл наследовал от
ResourceDictionary
вместо ContentPage
.
- Добавлен код в App.xaml для объединения словаря ресурсов.
Я продолжаю получать ArgumentException "Объект типа 'NInterpret.InterpretedObject' не может быть преобразован в тип 'Xamarin.Forms.ResourceDictionary'." когда он запускает "InitializeComponent ();" в App.xaml.cs.
Я запускаю приложение в Xamarin Live Player и использую сообщество Visual Studio 2017 (все обновляется).
NuGet показывает, что существует пять обновлений Xamarin, но чтобы применить их, мне придется изменить целевую версию с Android 7.1 на 8.1. Я не встречал никакой информации о том, что MergedDictionaries будет работать только в Android 8.1.
Код приложения. Xaml:
<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TestApp2.App"
xmlns:style="clr-namespace:TestApp2">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<style:MyDic />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
MyDic.xaml код:
<?xml version="1.0" encoding="utf-8" ?>
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TestApp2.MyDic">
<Style TargetType="Button">
<Setter Property="BackgroundColor" Value="Yellow" />
</Style>
</ResourceDictionary>
MyDic.xaml.cs код:
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace TestApp2
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MyDic : ResourceDictionary
{
}
}
Я попытался использовать вместо этого MergedWith со следующим кодом
<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TestApp2.App"
xmlns:style="clr-namespace:TestApp2">
<Application.Resources>
<ResourceDictionary x:Key="Dictionary1" MergedWith="style:MyDic"/>
</Application.Resources>
</Application>
, но также получить ArgumentException: «MergedWith должен наследоваться от ResourceDictionary».
После некоторого тестирования я понял, что когда я добавил новый ContentPage в Visual Studio, страница не могла быть открыта. Я предположил, что это означает, что ResourceDictionary, следовательно, может быть как-то поврежден. Я нашел сообщение об ошибке (https://developercommunity.visualstudio.com/content/problem/160939/bug-adding-xaml-content-page-to-shared-project-xam.html), относящееся к другой проблеме, но попытался, и это решило проблему, так что страницы содержимого могли открываться, но не проблема ResourceDictionary.
Я попытался переместить ResourceDictionary в файл MainPage.xaml, но вместо этого произошло то же исключение в MainPage.xaml.cs.
Любая помощь будет принята с благодарностью!
Предложения, которые я пробовал:
- По предложению Диего я удалил папку obj и bin, закрыл и заново открыл VS, очистил и восстановил (и прыгнул 3 раза со скрещенными пальцами), но безуспешно. Та же ошибка. Спасибо за предложение Диего. :)
- Полная переустановка ПК ничего не сделала - все то же исключение.
Есть еще предложения?