Это странное поведение, и хотя я не могу сказать, почему это происходит, я могу порекомендовать некоторые варианты.
Во-первых, наблюдение. Если вы включаете изображение как Контент в VS и копируете его в выходной каталог, ваш код работает. Если изображение помечено как None в VS, и вы копируете его, оно не работает.
Решение 1: FileStream
Объект BitmapImage принимает UriSource или StreamSource в качестве параметра. Давайте вместо этого воспользуемся StreamSource.
FileStream stream = new FileStream("picture.png", FileMode.Open, FileAccess.Read);
Image i = new Image();
BitmapImage src = new BitmapImage();
src.BeginInit();
src.StreamSource = stream;
src.EndInit();
i.Source = src;
i.Stretch = Stretch.Uniform;
panel.Children.Add(i);
Проблема: поток остается открытым. Если вы закроете его в конце этого метода, изображение не будет отображаться. Это означает, что файл остается заблокированным для записи в системе.
Решение 2: MemoryStream
Это в основном решение 1, но вы читаете файл в поток памяти и передаете этот поток памяти в качестве аргумента.
MemoryStream ms = new MemoryStream();
FileStream stream = new FileStream("picture.png", FileMode.Open, FileAccess.Read);
ms.SetLength(stream.Length);
stream.Read(ms.GetBuffer(), 0, (int)stream.Length);
ms.Flush();
stream.Close();
Image i = new Image();
BitmapImage src = new BitmapImage();
src.BeginInit();
src.StreamSource = ms;
src.EndInit();
i.Source = src;
i.Stretch = Stretch.Uniform;
panel.Children.Add(i);
Теперь вы можете изменить файл в системе, если это то, что вам нужно.