Pull to refresh

Запускаем Xamarin.Forms на Windows 7

Reading time3 min
Views12K
Xamarin.Forms достаточно интересный и перспективный фреймворк, который сейчас активно развивается и позволяет достаточно быстро получить кроссплатформенное приложение. По умолчанию Xamarin.Forms поддерживает 5 платформ, а именно: Android, iOS, WP, WinRT, UWP.

Несмотря на то, что Microsoft старается активно пересадить своих пользователей на Windows 10, на сегодняшний день Windows 7 все еще очень распространен во многих организациях, и возникает необходимость портирования/разработки приложения под Windows 7.

У меня возникла такая же ситуация — нам необходимо было разработать решение не только для Android и iOS, но и для Windows 7.

К счастью, Microsoft открыла исходный код Xamarin.Forms, и в качестве эксперимента, особенно ни на что не надеясь, я сделал форк Xamarin.Forms и портировал решение Xamarin.Forms.WP на WPF.

То, что из этого получилось, можно увидеть ниже на простых примерах.

Демо

Начнем с простой формы:

 <StackLayout>
    <Label Text="Имя"></Label>
    <Entry></Entry>
    <Label Text="Фамилия"></Label>
    <Entry></Entry>
    <Button Text="Отправить"></Button>
  </StackLayout>


По умолчанию на WPF выглядит так, как если бы приложение было создано в родном XAML WPF:

Для сравнения Win8:

и iOS(IPad):


Теперь возьмем что-нибудь посложнее — пример генерации страницы с шахматной доской из кода книжки Xamarin.Forms)

    public class ChessboardFixedPage : ContentPage
    {
        public ChessboardFixedPage()
        {
            const double squareSize = 35;
            AbsoluteLayout absoluteLayout = new AbsoluteLayout
            {
                BackgroundColor = Color.FromRgb(240, 220, 130),
                HorizontalOptions = LayoutOptions.Center,
                VerticalOptions = LayoutOptions.Center
            };
            for (int row = 0; row < 8; row++)
            {
                for (int col = 0; col < 8; col++)
                {
                    // Skip every other square.
                    if (((row ^ col) & 1) == 0)
                        continue;
                    BoxView boxView = new BoxView
                    {
                        Color = Color.FromRgb(0, 64, 0)
                    };
                    Rectangle rect = new Rectangle(col * squareSize,
                    row * squareSize,
                    squareSize, squareSize);
                    absoluteLayout.Children.Add(boxView, rect);
                }
            }
            this.Content = absoluteLayout;
        }
    }


Запустив этот код на WPF, iOS(iPhone), WP, получим следующую картину:


Как подключить

Скачать исходный код проекта и подключить можно c github.

Однако, если вы не хотите возиться с исходными кодами и хотите просто подключить и проверить работоспособность своего проекта с WPF, вы можете скачать готовые сборки по ссылке.

Инструкция по подключению:
1. Добавьте в свое решение с Xamarin.Forms новый проект с WPF Application.
2. Добавьте в новый проект ссылки на скачанные DLL.
3. Добавьте ссылку на основной проект с Xamarin.Forms кодом (допустим, имя проекта MyProgramm.Core).
4. Замените класс MainWindow (в файле MainWindow.xaml.cs) следующим кодом:

public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            Forms.Init();
            var app = new MyProgramm.Core.App();
            LoadApplication(app);
        }
    }

Обратите внимание: Здесь важно не перепутать App класс из WPF и App класс из Xamarin.Forms

5. В MainWindow.xaml смените корневой элемент с Window на FormsApplicationPage.

<wpf:FormsApplicationPage 
        x:Class="MyProgramm.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:MyProgramm.WPF"
        xmlns:wpf="clr-namespace:Xamarin.Forms.Platform.WPF;assembly=Xamarin.Forms.Platform.WPF"
        mc:Ignorable="d"
        Title="MainWindow">
    <Grid>
        
    </Grid>
</wpf:FormsApplicationPage>


Обратите внимание: на пространство имен xmlns:local=«clr-namespace:MyProgramm.WPF».

Вот и все, можете пробовать запускать свое приложение!

Состояние

На текущий момент проект в очень сыром состоянии, и в первую очередь будет уделяться внимание тем недоработкам и багам, которые будут нужны на моей основной работе.

Развитие

Изначально проект создавался в домашних условиях в качестве эксперимента. На текущий момент мы активно используем-дорабатываем его на работе, и так как я потратил достаточно много рабочего времени на доработку проекта, то мы планируем переезд на официальный Github компании с созданием минимально необходимой документации и шаблонов проектов для установки.

Когда проект будет в достаточно стабильном состоянии, и будут закрыты наиболее критичные баги, скорее всего вернем форк в официальный репозиторий.

Резюме

На текущий момент проект Xamarin.Forms.WPF выглядит достаточно перспективным для нас и уже сейчас позволяет сэкономить силы наших разработчиков на отсутствие дублирования кода со всеми вытекающими последствиями отдельно для WPF. В будущем есть желание попробовать силы в направлении Xamarin.Forms.Mac. Есть гораздо более сложнореализуемая задумка с планами Xamarin.Forms.Web.

Если проект вызывал интерес, приглашаю присоединяться к проекту и принять участие в развитии продукта.
Tags:
Hubs:
+23
Comments5

Articles