I solved it. I dug some more and investigated the exact error that was thrown. Here's the stacktrace:
at System.Windows.Window._OnIconChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, OperationType operationType) at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, OperationType operationType, Boolean isInternal) at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value) at System.Windows.Window.set_Icon(ImageSource value) at ImageToBase64String.MainWindow.btnStrToImg_Click(Object sender, RoutedEventArgs e) in c:\Data\Source\TorrentRover\TorrentRover\ImageToBase64String\ImageToBase64String\MainWindow.xaml.cs:line 48
You'll notice the exception was thrown in System.Windows.Window._OnIconChanged. Here's what that looks like using ILSpy:
// System.Windows.Window
private static void _OnIconChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Window window = (Window)d;
BitmapFrame bitmapFrame;
if (e.NewValue == null)
{
bitmapFrame = null;
}
else
{
bitmapFrame = (e.NewValue as BitmapFrame);
if (bitmapFrame == null)
{
throw new InvalidOperationException(SR.Get("IconMustBeBitmapFrame"));
}
}
window.OnIconChanged(bitmapFrame);
}
This led me to believe I need a BitmapFrame around my bitmap image. So I changed my Base64StringToImageSource method, and now it works.
public static System.Windows.Media.ImageSource Base64StringToImageSource(string base64String)
{
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64String)))
{
return BitmapFrame.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
}