C # WPF: получить источник изображения из свойства. Ресурсы [дубликаты]

вы можете найти реализацию этого (с некоторым хорошим объяснением) в 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

7
задан Scimonster 21 December 2016 в 21:00
поделиться

1 ответ

Хотя ресурс изображения в проекте 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.

31
ответ дан Clemens 18 August 2018 в 11:54
поделиться
  • 1
    Клеменс, ты качаешь! Это был фантастический, всеобъемлющий, легкий для понимания ответ. Я испытываю соблазн использовать опцию привязки, но в моем случае первый вариант установки источника в коде-код слишком изящный. Единственная проблема в том, что я не мог заставить ее работать с файлами png. Я надеялся на прозрачный фон. Должен ли он работать с файлами png? Я просто делаю что-то неправильно, или они не поддерживаются? – dtaylor 21 February 2013 в 23:02
  • 2
    Это должно также работать с файлами PNG. Возможно, вы не должны добавлять их в качестве ресурсов для своего проекта (см. Мое редактирование). Просто создайте файлы с помощью своего любимого инструмента изображения и добавьте их в папку в вашем проекте. См. здесь о принятии. – Clemens 21 February 2013 в 23:41
  • 3
    Клеменс. Опять ты дал ясный и краткий ответ! Файл PNG отлично работает, когда я просто помещаю его в папку и превращаю его как ресурс, а не добавляю его как resource.resource в Resource Designer. Бесконечно благодарен. – dtaylor 22 February 2013 в 15:27
Другие вопросы по тегам:

Похожие вопросы: