зачем использовать BeginInit () с простыми BitmapImages? - PullRequest
3 голосов
/ 30 ноября 2011

Я видел много таких в Интернете:

var b = new BitmapImage();
b.BeginInit();
b.UriSource = new Uri(myPath, UriKind.RelativeOrAbsolute);
b.EndInit();
myImage.Source = b;

Теперь, насколько я понимаю, я бы сначала пошел на более компактную версию:

myImage.Source = new BitmapImage(new Uri(myPath, UriKind.RelativeOrAbsolute));

есть ли причина, по которой я должен написать первый вместо второго?

что именно делают "BeginInit ()" и "EndInit ()" в этом случае, что не будет сделано во второй версии?

Я угадываю "ничего", но, опять же, у меня было достаточно опыта, чтобы показать мне, что WPF намного тоньше, чем я думал, что это неудивительно ...

edit: Просто чтобы прояснить ситуацию, я НЕ хочу сказать, что я абсолютно хочу сэкономить 4 строки кода. Я бы предпочел узнать, что именно делают эти два метода, и причину, по которой они должны (или не должны) вызываться.

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

Я думаю, что они делают это, просто чтобы соответствовать другому коду.BitmapImage имеет несколько свойств, которые должны быть установлены только один раз перед загрузкой изображения.Например DecodePixelHeight и DecodePixelWidth.Для правильной их установки необходимо использовать BeginInit способ.И, конечно, когда кто-то показывает примеры, он просто использует тот же синтаксис, к которому привык, и удаляет только строки несвязанных свойств.Если вам не нужно устанавливать какие-либо из них, вы можете сделать краткий синтаксис.

2 голосов
/ 30 ноября 2011

Тот факт, что два метода можно использовать только в парах и выбрасывать InvalidOperationException, говорит мне, что они stall инициализируют BitmapImage. Любая инициализация свойства между двумя методами будет выполнена до инициализации BitmapImage.

И, как я сказал в комментарии,

Думаю, здесь нет проблем, потому что у вас есть удобный конструктор, который принимает Uri в качестве параметра.

...