C# 6.0 mvvm automatically raise PropertyChanged event

In c#+xaml applications I offen had to write similar code when you want your ViewModel notify view about property changing:

private object _property;
public object Property
{
  get { return _property; }
  set
  {
    _property = value; 
    OnPropertyChanged();
  }
}

it's not hard to write thouse liens especially with resharper, but usually it makes your view model very long and less readable.
So I tried to find way to decrease amount of lines. 

After some experiments (post sharp, custom attributes, etc.) I came to following solution:

- created property wrapper class Prop<T> :

public class Prop<T> : INotifyPropertyChanged
    {
        private T _value;
        
        public Prop(Action propertyChangedCallback)
        {
            _propertyChangedCallback = propertyChangedCallback;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public T Value
        {
            get { return _value; }
            set
            {
                _value = value;
                OnPropertyChanged();
            }
        }

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

And in base ViewModelBase class added method GetProp:

private Dictionary<string, object> _props;

private Dictionary<string, object> Props => _props ?? (_props = new Dictionary<string, object>()); 

protected Prop<T> GetProp<T>([CallerMemberName] string key = null)
{
            object result;
            if (!Props.TryGetValue(key, out result))
            {
                result = new Prop<T>(() => RaisePropertyChanged(key));
                Props[key] = result;
            }

            return (Prop<T>)result;
}

So now I can write only 1 line instead of 10:
public Prop<string> MyLittleProperty => GetProp<string>();
But there is a minus in this method: you can't using your property just by name like MyLittleProperty = value, but will have to write: MyLittleProperty.Value = newValue;
or you can extend your Prop class with method Set(value), which will be little shorter.
Also in Xaml you will erite {Binding MyLittleProperty.Value} otherwise you'll see ToString() result of Prop class (in case if you binding to textblock.text)

I belive there can be workaround by using TypeConvertor class, but I didn't try it in my current project. It's have to work on winrt 8.1 and there are no support for TypeConvertor. Only in windows 10 and classical Net Framework.

So If you'll find better solution, welcome to commentaries!

Pixel Art Studio

Just put it here:

PixelArtStudio is powerful and easy-to-use tool for anyone, who want to make pixel perfect art. Optimized for pen and touch input devices. Perfectly fit for making pixel art, game graphics and sketching.

Features:
Easy to use and powerful user interface
Standart instruments for graphic editing (freehand drawing, floodfill, erase, etc.)
Tiled  and sprite preview mode
Import/export to PNG
Different brushes types
Brush opacity and size settings
Pen pressure supprort for some brushes
Special effects on layers (shadow, color overlay)
Custom canvas size
Advanced layers functionality
Symmetrical drawing
Control over every pixel of your artwork
Shape drawing with selected brushes
export to online gallery

links:
Promo page
http://pixelart.studio

Windows store 
https://www.microsoft.com/en-us/store/apps/pixelartstudio/9nblggh1zdfv 

vk.com
http://vk.com/powerpixelartstudio

Page on facebook
https://www.facebook.com/powerpixelartstudio

Online gallery:
http://pixelart.studio/Gallery


Scale/Resize very large image in Windows Store Application and save it to jpg stream in C#

public async void PhotoPicked(IReadOnlyList<StorageFile> files)
{
	StorageItemThumbnail resizedImage = await files[0].GetScaledImageAsThumbnailAsync(ThumbnailMode.SingleItem, 1024, ThumbnailOptions.None);
	imageStream = await SaveImageToJpegStream(resizedImage);//resizedImage.AsStreamForRead();
 }

public async static Task<Stream> SaveImageToJpegStream(StorageItemThumbnail resizedImage)
{
	var bm = new WriteableBitmap(1, 1);
	await bm.SetSourceAsync(resizedImage.CloneStream());

	var stream = new InMemoryRandomAccessStream();

	BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
	// Get pixels of the WriteableBitmap object 
	Stream pixelStream = bm.PixelBuffer.AsStream();
	byte[] pixels = new byte[pixelStream.Length];
	await pixelStream.ReadAsync(pixels, 0, pixels.Length);
	// Save the image file with jpg extension 
	encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)bm.PixelWidth, (uint)bm.PixelHeight, 96.0, 96.0, pixels);
	await encoder.FlushAsync();

	stream.Seek(0);
	return stream.AsStream();
}

Игра NORT в Windows Store

Взяли мою игрулю в Windows Store


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

вобщем щас буду грести миллионы :)) лопатой :D

В роцессе разработки выяснилось, что html5 не особо производительный в плане графики (точнее недостаточно, для моих целей)
т.к. поначалу хотел кучу эффектов добавить и прочих взрывов. на всем, кроме IE это сразу начинало тормозить, а на android и ios и без них тормозило.
на WP еще есть глюк со звуком, как только начинал воспроизводиться, то графика подвисала.

Пытался сначала сделать на юнити но он несколько громоздок, пока еще не идеален для 2д графики и требовал больше времени на разработку. 

Сейчас подумываю сделать движок на C# базе win2d библиотеки. Есть осование полагать, что он должен работать на порядок быстрее



итог по поводу сроков: 
начал где-то в ноябре. и за пару недель сделал прототип с парой уровней. потом когда понял, что на WP тормозит разбирался с unity. месяц назад понял, что с unity можно разбираться бесконечно и решил лучше доделать html5 версию, чем никакой не будет. 
Когда сделал все уровни понял, что энтузиазм закончился - буду выкладывать что есть :)
так что 2 месяца в общей сложности