Как использовать WPF Control "SharpMap"
Я хочу использовать SharpMap в приложении WPF, однако не могу понять, как использовать этот элемент управления. Это то, что я пробовал до сих пор, и тупики, с которыми я столкнулся.
Использование примера WPF, доступного на Github: SharpMap на GitHub.
Сначала я попытался открыть SharpMap.Sln в VS Community 2017. Я не могу собрать приложение из-за большого количества ошибок. Смотрите скриншот ниже. Я попытался переустановить все пакеты nuget без изменений, очистить, собрать и т. Д. Без радости. Слишком много ошибок в списке, которые в основном связаны с отсутствующими пространствами имен и т. Д.
Затем я попытался открыть только проект WPFSamples, снова переустановить пакеты Nuget и, наконец, добавить любые другие проекты, на которые есть ссылки, однако это только увеличило список ошибок.
Затем я попытался запустить новое приложение WPF и добавить следующие пакеты Nuget:
SharpMaps
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 решило проблему. Не было никаких предупреждений о том, что он указывает на неправильную версию фреймворка, поэтому решение проблемы было просто удачей.
- Что мне не хватает в моем коде ниже, чтобы заставить работать 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, и он будет работать.