ad magic string w PropertyChanged

nigdy nie podobały mi się te magic stringi
przy wywoływaniu PropertyChanged
okazuje się że innym też nie
patrz ile tu rozwiązań i porównanie wydajności:

http://blog.amusedia.com/2013/06/inotifypropertychanged-implementation.html

chyba fajna opcja to klaska Field<T>
ustalająca nazwę właściwości tylko raz – w konstruktorze

w .net 4.5 jest już [CallerMemberName] i sprawa staje się jeszcze prostsza

+ moje zastosowanie (trochę zmodyfikowane):

using System;
using System.Linq.Expressions;

namespace SigViewer
{
class Field<T>
{
public string PropertyName;
public T Value;

public Field(Expression<Func<T>> expression)
{
PropertyName = GetPropertyName(expression);
}

private string GetPropertyName<TFunType>(Expression<Func<TFunType>> expression)
{
var memberExpression = (MemberExpression)expression.Body;
return memberExpression.Member.Name;
}

public static implicit operator T(Field<T> t)
{
return t.Value;
}
}
}

using System.ComponentModel;
namespace SigViewer
{
class ChartViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private readonly Field<string> _title;
public string Title
{
get { return _title; }
set { Set(_title, value); }
}
public ChartViewModel()
{
_title = new Field<string>(() => Title);
}
protected void Set<T>(Field<T> field, T value)
{
field.Value = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(field.PropertyName));
}
}
}

Mono.Cairo rysowanie z zapisem do pdf

Wynalazłem taką bibliotekę do grafiki wektorowej,
jakaś ważna w linuxach w ogóle i wrapper .net robi do niej mono.
http://www.mono-project.com/Mono.Cairo
http://www.mono-project.com/Mono.Cairo_Cookbook
http://www.mono-project.com/Mono.Cairo_Tutorial

łatwo z jej pomocą coś narysować np. na pdf,
działa też w Visual Studio z .net40
nawet miałem ją w referencjach widzianych z Visual Studio
nie wiem już z jakiej okazji

Zrzuty z projektem Visual Studio generującym pdf:

cairo-proj

using Cairo;

namespace CairoPdf
{
class PdfDrawProg
{

static void Main()
{
using (var surface = new PdfSurface("out.pdf", 595.275, 841.889))
{
using (var gr = new Context(surface))
{
Draw(gr);
gr.ShowPage();
}
surface.Finish();
}

}

private static void Draw(Context gr)
{
gr.Translate(0,20);
gr.MoveTo(new PointD(100, 200));
gr.CurveTo(new PointD(100, 100), new PointD(100, 100),
new PointD(200, 100));
gr.CurveTo(new PointD(200, 200), new PointD(200, 200),
new PointD(100, 200));
gr.ClosePath();

gr.Save();
var pat = new LinearGradient(100, 200, 200, 100);
pat.AddColorStop(0, new Color(0, 0, 0, 1));
pat.AddColorStop(1, new Color(1, 0, 0, 1));
gr.Pattern = pat;

gr.FillPreserve();
gr.Restore();

gr.Color = new Color(0, 0, 0);

gr.LineWidth = 3;
gr.Stroke();
}

}
}


cairo-pdf