Как получить список установленного BitmapEncoders/Decoders (мир WPF)?

Другой подход в зависимости от того, как вы меняете div. Если вы используете JQuery для изменения содержимого div с помощью метода html (), вы можете расширить этот метод и вызвать функцию регистрации каждый раз, когда вы помещаете html в div.

(function( $, oldHtmlMethod ){
    // Override the core html method in the jQuery object.
    $.fn.html = function(){
        // Execute the original HTML method using the
        // augmented arguments collection.

        var results = oldHtmlMethod.apply( this, arguments );
        com.invisibility.elements.findAndRegisterElements(this);
        return results;

    };
})( jQuery, jQuery.fn.html );

Мы просто перехватываем вызывает html (), вызывает функцию регистрации с этим, которая в контексте относится к целевому элементу, получающему новый контент, затем мы передаем вызов исходной функции jquery.html (). Не забудьте вернуть результаты исходного метода html (), потому что JQuery ожидает его для цепочки методов.

Для получения дополнительной информации об переопределении и расширении метода проверьте http: //www.bennadel. com / blog / 2009-Using-Self-Executing-Function-Arguments-To-Override-Core-jQuery-Methods.htm , где я скрещивал функцию закрытия. Также ознакомьтесь с учебником плагинов на сайте JQuery.

10
задан Damjan Pavlica 1 January 2015 в 22:53
поделиться

2 ответа

Необходимо любить отражение.NET. Я работал над командой WPF и ни о чем не могу вполне думать лучше первое, что пришло на ум. Следующий код производит этот список на моей машине:

Bitmap Encoders:
System.Windows.Media.Imaging.BmpBitmapEncoder
System.Windows.Media.Imaging.GifBitmapEncoder
System.Windows.Media.Imaging.JpegBitmapEncoder
System.Windows.Media.Imaging.PngBitmapEncoder
System.Windows.Media.Imaging.TiffBitmapEncoder
System.Windows.Media.Imaging.WmpBitmapEncoder

Bitmap Decoders:
System.Windows.Media.Imaging.BmpBitmapDecoder
System.Windows.Media.Imaging.GifBitmapDecoder
System.Windows.Media.Imaging.IconBitmapDecoder
System.Windows.Media.Imaging.LateBoundBitmapDecoder
System.Windows.Media.Imaging.JpegBitmapDecoder
System.Windows.Media.Imaging.PngBitmapDecoder
System.Windows.Media.Imaging.TiffBitmapDecoder
System.Windows.Media.Imaging.WmpBitmapDecoder

Существует комментарий в коде, где добавить дополнительные блоки (если Вы поддерживаете плагины, например). Кроме того, Вы захотите отфильтровать список декодера для удаления:

System.Windows.Media.Imaging.LateBoundBitmapDecoder

Более сложная фильтрация с помощью сопоставления с образцом конструктора возможна, но я не испытываю желание писать это.:-)

Все, что необходимо сделать теперь, инстанцируют кодеров и декодеров для использования их. Кроме того, можно получить лучшие имена путем получения CodecInfo свойство декодеров кодера. Этот класс даст Вам человекочитаемые имена среди других фактоидов.

using System;
using System.Linq;
using System.Collections.Generic;
using System.Reflection;
using System.Windows.Media.Imaging;

namespace Codecs {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("Bitmap Encoders:");
            AllEncoderTypes.ToList().ForEach(t => Console.WriteLine(t.FullName));
            Console.WriteLine("\nBitmap Decoders:");
            AllDecoderTypes.ToList().ForEach(t => Console.WriteLine(t.FullName));
            Console.ReadKey();
        }

        static IEnumerable<Type> AllEncoderTypes {
            get {
                return AllSubclassesOf(typeof(BitmapEncoder));
            }
        }

        static IEnumerable<Type> AllDecoderTypes {
            get {
                return AllSubclassesOf(typeof(BitmapDecoder));
            }
        }

        static IEnumerable<Type> AllSubclassesOf(Type type) {
            var r = new Reflector();
            // Add additional assemblies here
            return r.AllSubclassesOf(type);
        }
    }

    class Reflector {
        List<Assembly> assemblies = new List<Assembly> { 
            typeof(BitmapDecoder).Assembly
        };
        public IEnumerable<Type> AllSubclassesOf(Type super) {
            foreach (var a in assemblies) {
                foreach (var t in a.GetExportedTypes()) {
                    if (t.IsSubclassOf(super)) {
                        yield return t;
                    }
                }
            }
        }
    }
}
4
ответ дан 4 December 2019 в 04:02
поделиться

Надо надеяться, кто-то исправит меня, если я буду неправ, но я не думаю, что существует что-либо как этот в WPF. Но надо надеяться это - один из многих случаев, где усовершенствования в технологии представили устаревший способ, которым мы привыкли делать вещи. Как, "как я проветриваю свои цифровые часы?"

К моему пониманию, причина, почему ImageCodecInfo. GetImageDecoders () необходим в Системе. Рисунок имеет отношение к топорной природе Системы. Рисование себя: Система. Рисунок является управляемой оболочкой вокруг GDI +, который является неуправляемой оберткой вокруг части API Win32. Таким образом, могла бы быть причина, почему новый кодек будет установлен в Windows без.NET, по сути зная об этом. И то, что возвращается из GetImageDecoders () является просто набором строк, которые обычно пасуются назад в Систему. Рисунок/GDI +, и используемый, чтобы найти и настроить соответствующий DLL для чтения/сохранения Вашего изображения.

С другой стороны, в WPF, стандартные кодеры и декодеры встроены в платформу, и, если я не ошибаюсь, ни от чего не зависьте это, которое, как гарантируют, не будет установлено как часть платформы. Следующие классы наследовались BitmapEncoder и являются доступным out-of-the-box с WPF: BmpBitmapEncoder, GifBitmapEncoder, JpegBitmapEncoder, PngBitmapEncoder, TiffBitmapEncoder, WmpBitmapEncoder. Существуют BitmapDecoders для всего одинакового форматы плюс IconBitmapDecoder и LateBoundBitmapDecoder.

Можно иметь дело со случаем, который я не воображаю, но мне кажется, что, если необходимо использовать класс, который наследовался BitmapEncoder, но не был включен с WPF, вероятно, собственный класс, Вы установили бы со своим приложением.

Надеюсь, это поможет. Если я пропускаю необходимую часть изображения, сообщите мне.

0
ответ дан 4 December 2019 в 04:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: