كيف يمكنني استخدام رمز يمثل موردًا في WPF؟

StackOverflow https://stackoverflow.com/questions/74466

  •  09-06-2019
  •  | 
  •  

سؤال

لدي ملف .ico مضمن كمورد (تم تعيين إجراء الإنشاء على المورد).أحاول إنشاء NotifyIcon.كيف يمكنني الرجوع إلى الأيقونة الخاصة بي؟

notifyIcon = new NotifyIcon();
notifyIcon.Icon = ??     // my icon file is called MyIcon.ico and is embedded
هل كانت مفيدة؟

المحلول

يجب إضافة ملف الرمز الخاص بك إلى إحدى مجموعات مشروعك ويجب تعيين إجراء البناء الخاص به على Resource.بعد إضافة مرجع إلى التجميع، يمكنك إنشاء NotifyIcon مثل هذا:

System.Windows.Forms.NotifyIcon icon = new System.Windows.Forms.NotifyIcon();
Stream iconStream = Application.GetResourceStream( new Uri( "pack://application:,,,/YourReferencedAssembly;component/YourPossibleSubFolder/YourResourceFile.ico" )).Stream;
icon.Icon = new System.Drawing.Icon( iconStream );

نصائح أخرى

أحد أنماط الاستخدام الشائعة هو أن تكون أيقونة الإشعارات هي نفس أيقونة النافذة الرئيسية.يتم تعريف الرمز كملف PNG.

للقيام بذلك، أضف الصورة إلى موارد المشروع ثم استخدمها كما يلي:

var iconHandle  = MyNamespace.Properties.Resources.MyImage.GetHicon();
this.notifyIcon.Icon = System.Drawing.Icon.FromHandle(iconHandle);

في نافذة XAML:

<Window x:Class="MyNamespace.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:Seahorse"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="600"
Icon="images\MyImage.png">

حسنًا، أنت لا تريد استخدام موارد نمط resx:ما عليك سوى لصق ملف ico في مشروعك في مجلد (دعنا نقول "ArtWork") وفي الخصائص، قم بتعيين Build Action على "Resources" ...

ثم يمكنك الرجوع إليه في XAML باستخدام PACK URIs ..."pack://application:,,,/Artwork/Notify.ico"

انظر هنا: http://msdn.microsoft.com/en-us/library/aa970069.aspx و ال عينة

إذا كنت تريد أن تكون أكثر قليلا ...مثل WPF، يجب عليك النظر في مساهمة WPF مشروع على CodePlex والذي يحتوي على عنصر تحكم NotifyIcon والذي يمكنك إنشاؤه في XAML والذي يستخدم قوائم WPF القياسية (حتى تتمكن من لصق "أي شيء" في القائمة).

إذا كنت تبحث فقط عن الإجابة البسيطة، فأعتقد أن هذا هو المكان الذي يكون فيه MyApp هو اسم تطبيقك وحيث يكون هذا هو اسم مساحة الاسم الجذر لتطبيقك.يجب عليك استخدام بناء جملة URI للحزمة، ولكن ليس من الضروري أن يكون الأمر معقدًا إلى هذا الحد لسحب رمز من مواردك المضمنة.

    <Window x:Class="MyApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Height="100"
    Width="200"
    Icon="pack://application:,,,/MyApp;component/Resources/small_icon.ico">

لقد قمت بإنشاء مشروع هنا واستخدمت موردًا مضمنًا (تم تعيين إجراء الإنشاء على "مورد مضمن"، بدلاً من مجرد مورد).لا يعمل هذا الحل مع المورد، ولكن قد تتمكن من معالجته.لقد وضعت هذا على OnIntialized() ولكن ليس من الضروري الذهاب إلى هناك.

//IconTest = namespace; exclamic.ico = resource 
System.IO.Stream stream = this.GetType().Assembly.GetManifestResourceStream("IconTest.Resources.exclamic.ico");

   if (stream != null)
   {
       //Decode the icon from the stream and set the first frame to the BitmapSource
       BitmapDecoder decoder = IconBitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
       BitmapSource source = decoder.Frames[0];

       //set the source of your image
       image.Source = source;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top