370 Stimmen

Einstellen der WPF-Bildquelle im Code

Ich versuche, die Quelle eines WPF-Bildes im Code festzulegen. Das Bild ist als eine Ressource in das Projekt eingebettet. Durch das Betrachten von Beispielen habe ich mit dem unten stehenden Code kommen. Aus irgendeinem Grund funktioniert es nicht - das Bild wird nicht angezeigt.

Bei der Fehlersuche kann ich sehen, dass der Stream die Bilddaten enthält. Was ist also falsch?

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;

Das Symbol ist in etwa wie folgt definiert: <Image x:Name="_icon" Width="16" Height="16" />

7voto

Bharat Thanki Punkte 1

Es gibt auch einen einfacheren Weg. Wenn das Bild als Ressource in der XAML geladen wird, und der fragliche Code ist der Code-Behind für diesen XAML-Inhalt:

Uri iconUri = new Uri("pack://application:,,,/ImageNAme.ico", UriKind.RelativeOrAbsolute);
NotifyIcon.Icon = BitmapFrame.Create(iconUri);

6voto

Arcturus Punkte 26057

Setzen Sie den Rahmen in einen VisualBrush:

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

brush.Visual = frame;

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

Den VisualBrush in GeometryDrawing einfügen

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;

Legen Sie nun die GeometryDrawing in ein DrawingImage:

new DrawingImage(drawing);

Legen Sie dies auf Ihre Bildquelle, und voilà!

Sie könnten es aber viel einfacher machen:

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

Und in Code:

BitmapImage image = new BitmapImage { UriSource="/yourassembly;component/YourImage.PNG" };

4voto

Mark Mullin Punkte 1340

Es gibt auch einen einfacheren Weg. Wenn das Bild als Ressource in der XAML geladen wird, und der fragliche Code ist der Codebehind für diese XAML:

Hier ist das Ressourcenverzeichnis für eine XAML-Datei - die einzige Zeile, die Sie interessiert, ist der ImageBrush mit dem Schlüssel "PosterBrush" - der Rest des Codes dient nur dazu, den Kontext zu zeigen

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

        </ResourceDictionary>
    </UserControl.Resources>

Im Code dahinter können Sie einfach Folgendes tun

ImageBrush posterBrush = (ImageBrush)Resources["PosterBrush"];

2voto

JoanComasFdz Punkte 2702

Ich bin ein neuer zu WPF, aber nicht in .NET.

Ich habe fünf Stunden damit verbracht, eine PNG-Datei zu einem "WPF Custom Control Library Project" in .NET 3.5 (Visual Studio 2010) hinzuzufügen und sie als Hintergrund für ein bildvererbtes Steuerelement festzulegen.

Nichts Relatives mit URIs hat funktioniert. Ich kann mir nicht vorstellen, warum es keine Methode gibt, um einen URI aus einer Ressourcendatei zu erhalten, durch IntelliSense, vielleicht als:

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

Ich habe versucht, eine Menge von URIs und spielte mit ResourceManager und Assemblys GetManifest Methoden, aber alles, was es waren Ausnahmen oder NULL-Werte.

Hier habe ich den Code, der bei mir funktioniert hat:

// 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;

2voto

maulik kansara Punkte 1059

Y

T

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;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X