Настройка источника изображения WPF в коде - PullRequest
304 голосов
/ 08 декабря 2008

Я пытаюсь установить источник изображения WPF в коде. Изображение внедрено как ресурс в проект. Просматривая примеры, я пришел к следующему коду. По какой-то причине это не работает - изображение не отображается.

При отладке я вижу, что поток содержит данные изображения. Так что не так?

Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
PngBitmapDecoder iconDecoder = new PngBitmapDecoder(iconStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
ImageSource iconSource = iconDecoder.Frames[0];
_icon.Source = iconSource;

Значок определяется примерно так: <Image x:Name="_icon" Width="16" Height="16" />

Ответы [ 17 ]

5 голосов
/ 05 июля 2010

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

Uri iconUri = new Uri("pack://application:,,,/ImageNAme.ico", UriKind.RelativeOrAbsolute);
NotifyIcon.Icon = BitmapFrame.Create(iconUri);
3 голосов
/ 15 января 2010

Есть и более простой способ. Если изображение загружено как ресурс в 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 голосов
/ 08 декабря 2008

Поместите рамку в 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);

Поместите это на ваш источник изображения, и вуаля!

Вы могли бы сделать это намного проще, хотя:

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

И в коде:

BitmapImage image = new BitmapImage { UriSource="/yourassembly;component/YourImage.PNG" };
2 голосов
/ 24 марта 2010

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

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

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

    <Button Width="200" Height="70">
      <Button.Content>
        <StackPanel>
          <Image Width="20" Height="20">
            <Image.Source>
              <BitmapImage UriSource="/Company.ProductAssembly;component/Icons/ClickMe.png"></BitmapImage>
              </Image.Source>
          </Image>
          <TextBlock HorizontalAlignment="Center">Click me!</TextBlock>
        </StackPanel>
      </Button.Content>
    </Button>
    

Готово.

2 голосов
/ 04 июля 2010

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

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

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

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

Я перепробовал множество URI и поиграл с ResourceManager и методами ассемблера GetManifest, но все это были исключения или значения 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;
1 голос
/ 11 апреля 2010

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

static ImageSource PngStreamToImageSource (Stream pngStream) {
    var decoder = new PngBitmapDecoder(pngStream,
        BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
    return decoder.Frames[0];
}
1 голос
/ 11 апреля 2015

Вы просто немного пропустили.

Чтобы получить встроенный ресурс из любой сборки, вы должны указать имя сборки вместе с именем вашего файла, как я упоминал здесь:

Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream(asm.GetName().Name + "." + "Desert.jpg");
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = iconStream;
bitmap.EndInit();
image1.Source = bitmap;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...