Установка источника изображения WPF в коде

Хорошей идеей является использование «объектно-реляционного картографа», подобного Idiorm :

$user = ORM::for_table('user')
->where_equal('username', 'j4mie')
->find_one();

$user->first_name = 'Jamie';
$user->save();

$tweets = ORM::for_table('tweet')
    ->select('tweet.*')
    ->join('user', array(
        'user.id', '=', 'tweet.user_id'
    ))
    ->where_equal('user.username', 'j4mie')
    ->find_many();

foreach ($tweets as $tweet) {
    echo $tweet->text;
}

Он не только избавляет вас от SQL-инъекций, но и от синтаксических ошибок! Также поддерживает коллекции моделей с цепочкой методов для фильтрации или применения действий к нескольким результатам сразу и нескольких подключений.

315
задан Arcturus 10 January 2019 в 21:03
поделиться

11 ответов

После того, как я столкнулся с той же проблемой, что и вы, и немного почитал, я обнаружил решение - Pack URIs .

Я сделал следующее в коде:

Image finalImage = new Image();
finalImage.Width = 80;
...
BitmapImage logo = new BitmapImage();
logo.BeginInit();
logo.UriSource = new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png");
logo.EndInit();
...
finalImage.Source = logo;

Или короче, используя другой конструктор BitmapImage:

finalImage.Source = new BitmapImage(
    new Uri("pack://application:,,,/AssemblyName;component/Resources/logo.png"));

URI разбит на части:

  • Полномочия: приложение: ///
  • Путь: имя файла ресурсов, который скомпилирован в сборку, на которую указывает ссылка. Путь должен соответствовать следующему формату: AssemblyShortName [; Version] [; PublicKey]; component / Path

    • AssemblyShortName: краткое имя для указанной сборки.
    • ; Версия [необязательно]: версия указанная сборка, содержащая файл ресурсов. Это используется, когда загружены две или более сборки, на которые имеется ссылка, с одинаковым коротким именем.
    • ; PublicKey [необязательно]: открытый ключ, который использовался для подписи сборки, на которую указывает ссылка. Это используется, когда загружены две или более сборки, на которые есть ссылка, с одинаковым коротким именем.
    • ; component: указывает, что ссылка на сборку указана из локальной сборки.
    • / Path: имя файла ресурсов, включая его путь относительно корня папки проекта сборки, на которую указывает ссылка.

Три косой черты после application: необходимо заменить запятыми:

Примечание: компонент полномочий в URI пакета это встроенный URI, который указывает на пакет и должен соответствовать RFC 2396. Кроме того, символ "/" должен заменить символом ",", и зарезервированные символы, такие как "%" а также "?" нужно избежать. Посмотреть OPC для получения подробной информации.

И, конечно же, убедитесь, что вы установили действие сборки для своего образа на Ресурс .

404
ответ дан 23 November 2019 в 01:06
поделиться

Поместите кадр в VisualBrush:

VisualBrush brush = new VisualBrush { TileMode = TileMode.None };

brush.Visual = frame;

brush.AlignmentX = AlignmentX.Center;
brush.AlignmentY = AlignmentY.Center;
brush.Stretch = Stretch.Uniform;

Помещенный VisualBrush в GeometryDrawing

GeometryDrawing drawing = new GeometryDrawing();

drawing.Brush = brush;

// Brush this in 1, 1 ratio
RectangleGeometry rect = new RectangleGeometry { Rect = new Rect(0, 0, 1, 1) };
drawing.Geometry = rect;

Теперь помещают GeometryDrawing в DrawingImage:

new DrawingImage(drawing);

Место это на Вашем источнике изображения и voilГ!

Вы могли сделать это намного легче хотя:

<Image>
    <Image.Source>
        <BitmapImage UriSource="/yourassembly;component/YourImage.PNG"></BitmapImage>
    </Image.Source>
</Image>

И в коде:

BitmapImage image = new BitmapImage { UriSource="/yourassembly;component/YourImage.PNG" };
3
ответ дан Peter Mortensen 23 November 2019 в 01:06
поделиться

Имейте Вас попробованный:

Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = iconStream;
bitmap.EndInit();
_icon.Source = bitmap;
14
ответ дан Andrew Myhre 23 November 2019 в 01:06
поделиться

Вот пример, который устанавливает изображение путь динамически (изображение находится где-то на диске, а не создается как ресурс):

if (File.Exists(imagePath))
{
    // Create image element to set as icon on the menu element
    Image icon = new Image();
    BitmapImage bmImage = new BitmapImage();
    bmImage.BeginInit();
    bmImage.UriSource = new Uri(imagePath, UriKind.Absolute);
    bmImage.EndInit();
    icon.Source = bmImage;
    icon.MaxWidth = 25;
    item.Icon = icon;
}

Размышления о значках ...

На первый взгляд вы могли подумать, что свойство Icon может содержать только изображение. Но на самом деле он может содержать что угодно! Я обнаружил это случайно, когда программно попытался установить свойство Image непосредственно на строку с путем к изображению. В результате отображалось не изображение, а фактический текст пути!

Это приводит к альтернативе, заключающейся в том, что не нужно создавать изображение для значка, а вместо этого использовать текст с символьным шрифтом для отображения простого "икона". В следующем примере используется шрифт Wingdings , который содержит символ «дискета». Этот символ на самом деле является символом <, который имеет особое значение в XAML, поэтому вместо этого мы должны использовать закодированную версию & lt; . Это работает как мечта! Ниже показан символ дискеты в виде значка в пункте меню:

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>
</MenuItem>
8
ответ дан 23 November 2019 в 01:06
поделиться
var uriSource = new Uri(@"/WpfApplication1;component/Images/Untitled.png", UriKind.Relative);
foo.Source = new BitmapImage(uriSource);

Это загрузит изображение с именем «Untitled.png» в папку с именем «Images» с его «Build Action», установленным на «Resource», в сборке с именем «WpfApplication1».

170
ответ дан 23 November 2019 в 01:06
поделиться

Это немного меньше кода и может быть сделано в одной строке.

string packUri = "pack://application:,,,/AssemblyName;component/Images/icon.png";
_image.Source = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource;
73
ответ дан 23 November 2019 в 01:06
поделиться

Также есть проще проще. Если изображение загружено в виде ресурса в XAML, и в вопросе кода - это код, который является кодовым, который для этого XAML:

Вот словарь ресурсов для XAML-файла - единственная строка, которую вы заботитесь о том, является Imagebrush с ключом «Posterbrush «- Остальная часть кода - просто чтобы показать контекст

<UserControl.Resources>
        <ResourceDictionary>
            <ImageBrush x:Key="PosterBrush" ImageSource="..\Resources\Images\EmptyPoster.jpg" Stretch="UniformToFill"/>

        </ResourceDictionary>
    </UserControl.Resources>

Теперь, в коде, вы можете просто сделать это

ImageBrush posterBrush = (ImageBrush)Resources["PosterBrush"];
3
ответ дан 23 November 2019 в 01:06
поделиться

Как загрузить изображение из встроенных в ресурсы значков и изображений (исправленная версия Arcturus):

Предположим, вы хотите добавить кнопку с изображением. Что делать?

  1. Добавьте в папку проекта значки и поместите сюда изображение ClickMe.png
  2. В свойствах ClickMe.png установите для BuildAction значение Resource
  3. Предположим, имя вашей скомпилированной сборки - Company.ProductAssembly.dll '.
  4. Теперь пора загрузить наше изображение в XAML

      
     

Готово.

2
ответ дан 23 November 2019 в 01:06
поделиться

Если у вас уже есть поток и вы знаете его формат, вы можете использовать что-то вроде этого:

static ImageSource PngStreamToImageSource (Stream pngStream) {
    var decoder = new PngBitmapDecoder(pngStream,
        BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
    return decoder.Frames[0];
}
1
ответ дан 23 November 2019 в 01:06
поделиться

Я новичок в WPF, но не в .NET.

Я потратил пять часов, пытаясь добавить файл PNG в «Проект библиотеки настраиваемых элементов управления WPF» в .NET 3.5 (Visual Studio 2010) и установить его в качестве фона для элемента управления, унаследованного от изображения.

Ничего подобного с URI не работало. Я не могу себе представить, почему нет метода для получения URI из файла ресурсов через IntelliSense, например:

Properties.Resources.ResourceManager.GetURI("my_image");

Я пробовал много URI и играл с ResourceManager и методами GetManifest Assembly, но все были исключения или значения NULL.

Вот код, который у меня работал:

// Convert the image in resources to a Stream
Stream ms = new MemoryStream()
Properties.Resources.MyImage.Save(ms, ImageFormat.Png);

// Create a BitmapImage with the stream.
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = ms;
bitmap.EndInit();

// Set as source
Source = bitmap;
2
ответ дан 23 November 2019 в 01:06
поделиться

Есть способ попроще. Если изображение загружается как ресурс в XAML, а рассматриваемый код является выделенным кодом для этого содержимого XAML:

Uri iconUri = new Uri("pack://application:,,,/ImageNAme.ico", UriKind.RelativeOrAbsolute);
NotifyIcon.Icon = BitmapFrame.Create(iconUri);
5
ответ дан 23 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

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