Как получить System.Drawing.Image для различных System.Windows.MessageBoxImage (s) и/или System.Windows. Forms.MessageBoxIcon (s)Как получить изображение для различных MessageBoxImage (s) или MessageBoxIcon (s)
ответ
Вы можете также включить SystemIcons в вашем XAML следующим образом:
Включите конвертер (см. Код ниже) в качестве ресурса и элемент управления изображением в вашем XAML. Этот образец изображения здесь показывает значок информации.
<Window.Resources>
<Converters:SystemIconConverter x:Key="iconConverter"/>
</Window.Resources>
<Image Visibility="Visible"
Margin="10,10,0,1"
Stretch="Uniform"
MaxHeight="25"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Source="{Binding Converter={StaticResource iconConverter}, ConverterParameter=Information}"/>
Вот реализация для преобразователя:
using System;
using System.Drawing;
using System.Globalization;
using System.Reflection;
using System.Windows;
using System.Windows.Data;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
namespace Converters
{
[ValueConversion(typeof(string), typeof(BitmapSource))]
public class SystemIconConverter : IValueConverter
{
public object Convert(object value, Type type, object parameter, CultureInfo culture)
{
Icon icon = (Icon)typeof(SystemIcons).GetProperty(parameter.ToString(), BindingFlags.Public | BindingFlags.Static).GetValue(null, null);
BitmapSource bs = Imaging.CreateBitmapSourceFromHIcon(icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
return bs;
}
public object ConvertBack(object value, Type type, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
}
Как уже указано SystemIcons
класс, который должен содержать эти значки, а на ОС Windows 8.1 (и, возможно, в более ранних версиях тоже) значках присутствующие в SystemIcons
, отличаются от символов, отображаемых на MessageBoxes
в случае Asterisk, информации и вопроса. Значки в диалоговом окне выглядят много flatter. См - например - значок Вопрос:
значок в диалоге является родным диалоговое значок, и крайний левый значок в форме в фоновом режиме является икона извлечена из SystemIcons
класса.
Для различных методов и подробной информации о том, как получить значок из MessageBox увидеть эту answer, но я причисляю краткий обзор, просто для полноты картины:
Вы должны использовать функцию SHGetStockIconInfo
:
SHSTOCKICONINFO sii = new SHSTOCKICONINFO();
sii.cbSize = (UInt32)Marshal.SizeOf(typeof(SHSTOCKICONINFO));
Marshal.ThrowExceptionForHR(SHGetStockIconInfo(SHSTOCKICONID.SIID_INFO,
SHGSI.SHGSI_ICON ,
ref sii));
pictureBox1.Image = Icon.FromHandle(sii.hIcon).ToBitmap();
Пожалуйста note:
Если эта функция возвращает значок ручки в HIC на члена структуры SHSTOCKICONINFO указывает PSII, вы несете ответственность за освобождение значок с DestroyIcon, когда вам больше не нужно.
Конечно для этого, чтобы работать, вы должны определить несколько перечислений и структур:
public enum SHSTOCKICONID : uint
{
//...
SIID_INFO = 79,
//...
}
[Flags]
public enum SHGSI : uint
{
SHGSI_ICONLOCATION = 0,
SHGSI_ICON = 0x000000100,
SHGSI_SYSICONINDEX = 0x000004000,
SHGSI_LINKOVERLAY = 0x000008000,
SHGSI_SELECTED = 0x000010000,
SHGSI_LARGEICON = 0x000000000,
SHGSI_SMALLICON = 0x000000001,
SHGSI_SHELLICONSIZE = 0x000000004
}
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SHSTOCKICONINFO
{
public UInt32 cbSize;
public IntPtr hIcon;
public Int32 iSysIconIndex;
public Int32 iIcon;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260/*MAX_PATH*/)]
public string szPath;
}
[DllImport("Shell32.dll", SetLastError = false)]
public static extern Int32 SHGetStockIconInfo(SHSTOCKICONID siid, SHGSI uFlags, ref SHSTOCKICONINFO psii);
- 1. ORA-21500: внутренний код ошибки, аргументы: [% s], [% s], [% s], [% s], [% s], [% s], [% s], [% s]
- 2. Какой unicode он должен сделать такой эффект? = ͟͟͞͞s = ͟͟͞͞s = ͟͟͞͞s = ͟͟͞͞s = ͟͟͞͞s = ͟͟͞͞s = ͟͟͞͞s = ͟͟͞͞s
- 3. Свернуть и (lambda s: "" .join (s.split())) или (lambda s: s)
- 4. Разница между s = s + s и s + = s с короткими
- 5. Захват скобок -/(\ d) /? или/\ s *; \ s * /?
- 6. десятичный (s, p) или номер (s, p)?
- 7. , который быстрее s + = 'a' или s = s + 'a' в python
- 8. не перерисовывает изображение s
- 9. Имеет ли это регулярное выражение одну или две группы? "^ \\ s * (. *?) \\ s + - \\ s + '(. *)' \\ s * $"
- 10. Является ли s s эквивалентом s [i]?
- 11. В python, почему s * 3 быстрее, чем s + s + s?
- 12. Cassandra: read/s write/s
- 13. Почему logging.warning ("% s", s)?
- 14. Regex ", \\ s (. *?), \\ s"
- 15. Построить arraylist [s] из ряда других arraylist [s] row [s]
- 16. Регулярное выражение для (... Исключает-> \ ([\ s \ S] + \) ...)?
- 17. Как работает эта итерация: for (++ s; * s; ++ s)
- 18. Как получить объяснение gcc -s?
- 19. Почему [\\ s *] не эквивалентен \\ s *?
- 20. Выражение выражения для - ИЛИ - ИЛИ \ s
- 21. Что такое регулярное выражение?/([^ "^ \ s] +) \ s * |" ([^ "] +)" \ s */g
- 22. Как рассчитать MB/s & MiB/s?
- 23. уникальное ограничение (% s.% S) нарушено
- 24. fscanf ("% s% s", комета, группа);
- 25. chmod + s для Windows?
- 26. Сочетания клавиш Jquery - Command + S, Control + S
- 27. Два фиксированных IFrame s (или DIV s) на стороне
- 28. Конкатенация строк: str + str или "{: s} {: s}". Format()?
- 29. Значение S [3i] S [3i + 1] S [3i + 2]
- 30. Карта <S,S> в список <S>
Спасибо так много! Это отлично работает! Однако я заметил, что StackOverflow работает под лицензией Creative Commons. Таким образом, я технически не могу использовать/адаптировать свой код в своем коммерческом приложении (который я не хочу под лицензией Creative Commons) без вашего разрешения. Вы согласны дать мне разрешение? Я все еще могу отдать должное вашей работе. – skybluecodeflier
@skybluecodeflier, любой код, отправленный в StackOverflow, является творческим достоянием: http: //meta.stackexchange.com/questions/12527/do-i-have-to-worry-about-copyright-issues-for-code-posted-on-stack-overflow –
@ Zamboni Есть ли какая-то особая причина, по которой ваш конвертер игнорирует «значение» и выполняет преобразование, использующее только параметр? Это кажется нетипичным для преобразователей. –