вы можете найти реализацию этого (с некоторым хорошим объяснением) в F # на fssnip
вот важные части:
let GreatCircleDistance<[<Measure>] 'u> (R : float<'u>) (p1 : Location) (p2 : Location) =
let degToRad (x : float<deg>) = System.Math.PI * x / 180.0<deg/rad>
let sq x = x * x
// take the sin of the half and square the result
let sinSqHf (a : float<rad>) = (System.Math.Sin >> sq) (a / 2.0<rad>)
let cos (a : float<deg>) = System.Math.Cos (degToRad a / 1.0<rad>)
let dLat = (p2.Latitude - p1.Latitude) |> degToRad
let dLon = (p2.Longitude - p1.Longitude) |> degToRad
let a = sinSqHf dLat + cos p1.Latitude * cos p2.Latitude * sinSqHf dLon
let c = 2.0 * System.Math.Atan2(System.Math.Sqrt(a), System.Math.Sqrt(1.0-a))
R * c
Хотя ресурс изображения в проекте WPF генерирует свойство System.Drawing.Bitmap
в Resources.Designer.cs
, вы можете напрямую создать BitmapImage
из этого ресурса. Вам нужно только установить Build Action файла изображения на Resource
(вместо значения по умолчанию None
).
Если у вас есть файл Red.jpg
в Resources
в вашем проекте Visual Studio, создание BitmapImage
будет выглядеть, как показано ниже. Он использует WPF Pack Uri .
var uri = new Uri("pack://application:,,,/Resources/Red.jpg");
var bitmap = new BitmapImage(uri);
Если у вас есть Image
элемент управления, объявленный где-то в XAML следующим образом:
<Image x:Name="image"/>
вы могли бы просто установить свойство Source
изображения в свой битмап-файл в коде позади:
image.Source = bitmap;
Если вы предпочитаете устанавливать свойство Source
на вы могли бы создать свойство string
, которое возвращает URI изображения. Строка автоматически преобразуется в BitmapImage
с помощью встроенного TypeConverter
в WPF.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
ImageUri = "pack://application:,,,/Resources/Red.jpg";
}
public static readonly DependencyProperty ImageUriProperty =
DependencyProperty.Register("ImageUri", typeof(string), typeof(MainWindow));
public string ImageUri
{
get { return (string)GetValue(ImageUriProperty); }
set { SetValue(ImageUriProperty, value); }
}
}
В XAML вы привязываетесь к этому свойству:
<Image Source="{Binding ImageUri}"/>
Конечно, вы могли бы также объявить свойство типа ImageSource
public static readonly DependencyProperty ImageProperty =
DependencyProperty.Register("Image", typeof(ImageSource), typeof(MainWindow));
public ImageSource Image
{
get { return (ImageSource)GetValue(ImageProperty); }
set { SetValue(ImageProperty, value); }
}
и связать таким же образом:
<Image Source="{Binding Image}"/>
Теперь вы можете предварительно загрузить изображения и поместить их в свойство по мере необходимости:
private ImageSource imageRed =
new BitmapImage(new Uri("pack://application:,,,/Resources/Red.jpg"));
private ImageSource imageBlue =
new BitmapImage(new Uri("pack://application:,,,/Resources/Blue.jpg"));
...
Image = imageBlue;
UPDATE: в конце концов, ваши изображения не должны быть ресурсами в проект Visual Studio. Вы можете просто добавить папку проекта, поместить файлы изображений в эту папку и установить для своего действия по сборке значение Resource
. Если, например, вы вызываете папку Images
, URI будет pack://application:,,,/Images/Red.jpg
.