Как использовать WPF Control "SharpMap"

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

Использование примера WPF, доступного на 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=null'.

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

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();


        }

    }
}

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

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

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

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

0 ответов

Что касается вопроса 1, я также обновился до.Net 7.2, но он не изменился, мой WinformHost все еще был невидим. Я наконец понял, почему: в моем главном окне был параметр "AllowsTransparency=True". Это просто предотвращает отображение WinformHost... Измените его на False, и он будет работать.

Другие вопросы по тегам