Kodda WPF image mənbəyinin yaradılması

Kodda WPF şəklin qaynağını təyin etməyə çalışıram. Təsvir layihədə bir qaynaq şəklində yerləşdirilir. Məsələn nümunələri öyrənərək, aşağıdakı kodu verdim. Nədənsə bu işləmir - şəkil görünmür.

Debugging Mən axın görüntü data ehtiva edir görürəm. Yəni səhv nədir?

 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; 

Bir simge bu şəkildə müəyyən edilir: <Image x:Name="_icon" Width="16" Height="16" />

297
08 дек. Torbjørn 08 dek. 2008-12-08 19:15 '08 at 7:15 pm 2008-12-08 19:15
@ 17 cavab

Mənimlə eyni problemi olduğumdan və bir az oxuduğumdan sonra bir həll - Pack URI tapdım.

Kodda aşağıdakıları etdim:

 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; 

Qısacası, başqa bir BitmapImage qurucusunu istifadə edərək:

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

URI parçalanır:

  • Avtorizasiya: application:///
  • Yolu: referans toplusuna tərtib edilmiş resurs faylının adı. Yol aşağıdakı formata uyğun olmalıdır: AssemblyShortName[;Version][;PublicKey];component/Path

    • AssemblyShortName: müəyyən bir qurğunun qısa adı.
    • ; Versiyası [optional]: Resurs faylını ehtiva edən istinad komplektinin versiyası. Bu, eyni qısa adı olan iki və ya daha çox istinad kompleksi yüklənərkən istifadə olunur.
    • ; PublicKey [optional]: Başlanğıc məclisin imzalamasında istifadə edilən ictimai açar. Bu, eyni qısa adı olan iki və ya daha çox istinad kompleksi yüklənərkən istifadə olunur.
    • ; komponent: montaj istinadının yerli bir məclisdən olduğunu göstərir.
    • / Path: müəyyən edilmiş layihə layihəsi qovluğunun kökünə aid olan yolunu ehtiva edən resurs faylının adı.

Proqramdan sonra üç dilim application: virgülle əvəz olunmalıdır:

Qeyd Paket URI'sinin icazəsiz komponenti paketə işarə edən və RFC 2396 uyğun olmalıdır olan daxili URIdır. Bundan əlavə, "/" simvolu "," və "%" kimi qorunan simvollarla əvəz olunmalıdır. və "?" qaçdı. Ətraflı məlumat üçün OPC-ə baxın.

Və əlbəttə ki, Resursda təsviriniz üçün qurma hərəkətini təyin etdiyinizə əmin olun.

383
30 окт. 30 oktyabrda Jared Harley tərəfindən verilmiş cavab 2009-10-30 21:02 '09 da 21:02 'de 2009-10-30 21:02
 var uriSource = new Uri(@"/WpfApplication1;component/Images/Untitled.png", UriKind.Relative); foo.Source = new BitmapImage(uriSource); 
border=0

"WpfApplication1" adlı bir yığıncaqda "Resurs" da quraşdırılmış "Quraşdırma Fəaliyyəti" ilə "Şəkillər" adlı qovluğa "Untitled.png" adlı bir şəkil yüklənəcəkdir.

167
26 авг. Cavab 26 Avqustda Simon tərəfindən verildi . 2009-08-26 07:19 '09 da 07:19 'da 2009-08-26 07:19

Bu bir az daha az koddur və bir xətdə icra edilə bilər.

 string packUri = "pack://application:,,,/AssemblyName;component/Images/icon.png"; _image.Source = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource; 
72
06 янв. Jan 06-da Alex B tərəfindən verilmiş cavab 2010-01-06 20:47 '10 at 20:47 2010-01-06 20:47

Çox sadə:

Bir menyu elementinin görüntüsünü dinamik olaraq təyin etmək üçün aşağıdakı adımları baxın:

 MyMenuItem.ImageSource = new BitmapImage(new Uri("Resource/icon.ico",UriKind.Relative)); 

... "icon.ico" hər yerdə yerləşdirilə bilər (hal-hazırda resurslar kataloquundadır) və resurs kimi əlaqələndirilməlidir ...

40
12 дек. Cavab A Bothe 12 dekabr verilir. 2010-12-12 20:48 '10 at 20:48 2010-12-12 20:48

Bunu da bir xəttə endirə bilərsiniz. Bu mənim əsas pəncərəm üçün simvolu qurmaq üçün istifadə olunan koddur. .İco faylının məzmun olaraq qeyd ediləcəyi və çıxış qovluğuna kopyalanacağı ehtimal edilir.

  this.Icon = new BitmapImage(new Uri("Icon.ico", UriKind.Relative)); 
15
13 февр. Cavab 13 fevralda Payson Welch tərəfindən verilir . 2011-02-13 20:09 '11 at 20:09 2011-02-13 20:09

Siz cəhd etdiniz:

 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
10 февр. Cavab Andrew Myhre tərəfindən verilir. 10 fevral. 2009-02-10 01:37 '09 at 1:37 'da 2009-02-10 01:37

Ən asan yol:

 var uriSource = new Uri("image path here"); image1.Source = new BitmapImage(uriSource); 
13
17 нояб. Cavab 17 İyun tarixində Həsən tərəfindən verilir. 2011-11-17 12:24 '11 at 12:24 pm 2011-11-17 12:24

Bu mənim yolumdur:

 internal static class ResourceAccessor { public static Uri Get(string resourcePath) { var uri = string.Format( "pack://application:,,,/{0};component/{1}" , Assembly.GetExecutingAssembly().GetName().Name , resourcePath ); return new Uri(uri); } } 

İstifadə edin:

 new BitmapImage(ResourceAccessor.Get("Images/1.png")) 
11
09 мая '15 в 13:25 2015-05-09 13:25 cavab 2013 - il mayın 9-da saat 13: 25- də verilir

Dinamik olaraq bir görüntüyə yol qoyan bir nümunə (bir şəkil diskdə bir yerdə və bir qaynaq olaraq yaradılmır):

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

İkonlara dair fikirlər ...

Əvvəlcə düşünsəniz, İkon xüsusiyyətində yalnız bir şəkil ola bilər. Amma əslində bir şey ola bilər! Image yolunu birbaşa simvolu Image funksiyasını proqramlaşdırılmış şəkildə qurmağa çalışarkən bunu qəza ilə kəşf etmişəm. Nəticə bir şəkil deyil, yolun gerçək mətni idi!

Bu bir alternativə gətirib çıxarır: simge üçün bir şəkil yaratmaq lazım deyil, bunun əvəzinə sadə bir "icon" göstərmək üçün bir xarakterli yazı ilə mətni istifadə edin. Aşağıdakı misalda "floppidisk" yazısı olan Wingdings yazı tipi istifadə olunur. Bu xarakter həqiqətən < XAML-də xüsusi bir məna daşıyır, buna görə də kodlu versiyasını > əvəzinə. Bir yuxu kimi işləyir! Disket sembolü aşağıdakı menyuda bir simvol olaraq göstərilir:

 <MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save"> <MenuItem.Icon> <Label VerticalAlignment="Center" HorizontalAlignment="Center" FontFamily="Wingdings"> </MenuItem.Icon> </MenuItem> 
8
10 июля '09 в 13:06 2009-07-10 13:06 Cavab 10 İyul 2009 -cu il tarixdə saat 13: 06-da baş verənlərdən qorxur

Görünüşünüz ResourceDictionary'da saxlanılırsa, yalnız bir kod satırı ilə bunu edə bilərsiniz:

 MyImage.Source = MyImage.FindResource("MyImageKeyDictionary") as ImageSource; 
6
15 мая '17 в 12:47 2017-05-15 12:47 Cavab Hollyroody tərəfindən mayın 15-də saat 17 : 18- də 2017-05-05 12:47

Daha asan bir yol da var. Görünüş XAML-da bir qaynaq olaraq yüklənirsə və sözügedən kod bu XAML məzmununun vurğulanmış kodudur:

 Uri iconUri = new Uri("pack://application:,,,/ImageNAme.ico", UriKind.RelativeOrAbsolute); NotifyIcon.Icon = BitmapFrame.Create(iconUri); 
5
05 июля '10 в 12:05 2010-07-05 12:05 Cavab Bharat Teymi tərəfindən 05 iyul '05' də saat 12:05 'da veriləcək 2010-07-05 12:05

Daha asan bir yol da var. Şəkil XAML-da bir qaynaq kimi yüklənirsə və sözügedən kod XAML üçün kod göstəricisidirsə:

Burada, XAML faylının resurs lüğəti sizi narahat edən yeganə xəttdir - bu, "PosterBrush" ilə ImageBrush deyil - kodun qalan hissəsi yalnız konteksti göstərir

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

İndi kodda yalnız bunu edə bilərsiniz

 ImageBrush posterBrush = (ImageBrush)Resources["PosterBrush"]; 
3
15 янв. Mark Mullinin Jan 15 verdiyi cavabı 2010-01-15 05:04 '10 at 5:04 2010-01-15 05:04

Çərçivəni VisualBrush-a yerləşdirin:

 VisualBrush brush = new VisualBrush { TileMode = TileMode.None }; brush.Visual = frame; brush.AlignmentX = AlignmentX.Center; brush.AlignmentY = AlignmentY.Center; brush.Stretch = Stretch.Uniform; 

GeometryDrawing-də bir VisualBrush qoyun

 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; 

İndi DrawingImage-də GeometryDrawing qoydu:

 new DrawingImage(drawing); 

Bunu mənbə şəklində qoyun və voila!

Baxmayaraq ki, onu çox asanlaşdıra bilərsiniz:

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

Və kodda:

 BitmapImage image = new BitmapImage { UriSource="/yourassembly;component/YourImage.PNG" }; 
3
08 дек. Cavab Arcturus tərəfindən verilir 08 dekabr. 2008-12-08 19:24 '08 at 7:24 pm 2008-12-08 19:24

WPF üçün yeni deyiləm, amma. NET.

WPF Xüsusi Controls Kitabxana Layihəsinə .NET 3.5 (Visual Studio 2010) bir PNG faylı əlavə etməyə çalışır və onu miras alınmış nəzarət fonları kimi təyin etmək üçün beş saat vaxt sərf edirəm.

URI ilə əlaqəli heç bir şey işləməyib. İntelliSense vasitəsilə bir qaynaq faylından bir URI almaq üçün heç bir yolun olmadığını təsəvvür edə bilmirəm, bəlkə:

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

Mən bir çox URI-ni sınamışam və ResourceManager və Assam GetManifest metodları ilə oynadım, lakin onlar istisnalar və ya NULL dəyərlər idi.

Burada mənim üçün çalışan kodu əlavə edirəm:

 // 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
04 июля '10 в 18:23 2010-07-04 18:23 Cavab JoanComasFdz tərəfindən 04 İyul, '10 'da saat 18:23' də verildi. 2010-07-04 18:23

Nişanlardakı mənbələrdən və şəkillərdən (Arkturusun düzəldilmiş versiyası) bir görüntü yükləmək:

Bir görüntüyə sahib bir düyməni əlavə etmək istəyirik. Nə etməliyəm?

  1. Layihə simgelerini qovluğa əlavə edin və ClickMe.png image buraya yerləşdirin.
  2. "ClickMe.png" xüsusiyyətində "BuildAction" -ni "Resurs"
  3. Sizin kompilyatorunuzun adı "Company.ProductAssembly.dll" olduğunu varsayalım.
  4. İndi XAML-yə imicimizi yükləməyimiz lazımdır.

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

Yapılır.

2
24 марта '10 в 23:29 2010-03-24 23:29 Cavab Siarhei Kuchuk tərəfindən 24 Mart 2010 tarixində saat 23: 29-da 2010-03-24 23:29

Bir az qaçırdınız.

Daxil olan hər hansı bir yığından resurs almaq üçün, mən burada qeyd etdiyim kimi, faylın adını və toplantının adını göstərməlisiniz:

 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; 
1
11 апр. Cavab maulik kansara verildi 11 Apr. 2015-04-11 11:57 '15 at 11:57 2015-04-11 11:57

Zaten akışınız varsa və formatı bilirsinizsə, bu kimi bir şey istifadə edə bilərsiniz:

 static ImageSource PngStreamToImageSource (Stream pngStream) { var decoder = new PngBitmapDecoder(pngStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); return decoder.Frames[0]; } 
1
11 апр. cavab user166390 11 apr tərəfindən verilir . 2010-04-11 11:14 '10 at 11:14 2010-04-11 11:14