Как использовать WPF Control «SharpMap» - PullRequest
0 голосов
/ 31 августа 2018

Я хочу использовать SharpMap в приложении WPF, однако я не могу понять, как использовать этот элемент управления. Это то, что я пробовал до сих пор, и тупики, с которыми я столкнулся.

Использование WPFExample, доступного на Github: SharpMap на GitHub .

Сначала я попытался открыть SharpMap.Sln в VS Community 2017. Я не могу создать приложение из-за большого количества ошибок. Смотрите скриншот ниже. Я попытался переустановить все пакеты nuget без изменений, очистить, собрать и т. Д. Без радости. Слишком много ошибок в списке, которые в основном связаны с отсутствующими пространствами имен и т. Д.

Затем я попытался открыть только проект WPFSamples, снова переустановить пакеты Nuget и, наконец, добавить все другие проекты, на которые есть ссылки, однако это только увеличило список ошибок.

Затем я попытался запустить новое приложение WPF и добавить следующие пакеты Nuget:

  1. SharpMaps

  2. SharpMaps.UI

А затем вручную добавьте SharpMaps.UI.Wpf.dll из папки отладки примеров на GitHub. XAML я использовал ниже. Там нет кода позади. Решение будет построено без ошибок, однако при попытке запустить его выдает следующую ошибку:

System.Windows.Markup.XamlParseException: '' вызов конструктор типа SharpMap.UI.WPF.SharpMapHost, который соответствует указанные ограничения связывания вызвали исключение. ' Строка № 30 и позиция строки '10'. ' TypeLoadException: не удалось загрузить тип SharpMap.Layers.ILayer из сборки SharpMap, версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = ноль '.

Итак, мои вопросы:

1. Какие шаги пропущены, что мешает работе примера проекта WPF SharpMap в GitHub (я не получаю ошибок при открытии VS)? Теперь решено. Несмотря на использование VS2017, на нем был установлен только .NET 4.6.1, добавление до .NET 7.2 решило проблему. Не было никаких предупреждений о том, что он указывает на неправильную версию фреймворка, поэтому решить эту проблему было просто удачей.

  1. Чего мне не хватает в моем коде ниже, чтобы заставить работать острый SharpMap? К сожалению, в документации отсутствует какая-либо поддержка WPF, и я не могу найти других примеров, поэтому с этого момента это будет методом проб и ошибок.

XAML:

<Window x:Class="SharpMap.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:SharpMap"
    xmlns:smh="clr-namespace:SharpMap.UI.WPF;assembly=SharpMap.UI.WPF"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">

<Grid Name="grid1">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
    </Grid.RowDefinitions>
    <Menu Grid.Row="0" Name="Menu">
        <MenuItem Header="_File">
            <MenuItem Header="_Exit"/>
        </MenuItem>
        <MenuItem Header="_Add Layer">
            <MenuItem Header="_ShapeFile" Name="AddShapeLayer"/>
        </MenuItem>
        <MenuItem Header="_BackgroundMap">
            <MenuItem Header="_OpenStreetMap" Name="BgOsm" />
            <MenuItem Header="_MapQuest" Name="BgMapQuest" />
        </MenuItem>
    </Menu>

    <smh:SharpMapHost Name="WpfMap" Grid.Row="1"></smh:SharpMapHost>
    <StatusBar Grid.Row="2">
        <StatusBarItem Name="Coordinates" HorizontalAlignment="Right">
            <Label Content="{Binding CurrentMouseCoordinateString, ElementName=WpfMap, UpdateSourceTrigger=PropertyChanged}"></Label>
        </StatusBarItem>
    </StatusBar>
</Grid>
</Window>

Просто для полноты код , стоящий за (без изменений)

using System;
using System.Windows;
using System.Windows.Forms;
using SharpMap;
using SharpMap.Forms;
using GeoAPI.Geometries;
using Application = System.Windows.Application;
using MenuItem = System.Windows.Controls.MenuItem;

namespace SharpMap
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();


        }

    }
}

EDIT:

Я также пытался использовать MapSui, который использует SharpMap и поддерживает WPF, однако я до сих пор обнаруживаю, что не могу запустить примеры на GitHub, а также нет документации для создания простого примера.

РЕДАКТИРОВАТЬ 2:

Хорошо, я просто не могу заставить SharpMap работать в моем приложении WPF. После обновления моей платформы .NET я снова посетил MapSui и основал примеры, которые работали, как и ожидалось. Затем я применил MapSui к своему проекту, используя это простое руководство: Руководство по запуску MapSui и оно просто отлично работает. Я все еще думаю, что мой вопрос заслуживает ответа для тех, кто хочет использовать WPF и SHarpMap, однако я буду продолжать использовать MapSui.

...