Freitag, 21. August 2009

Erstellen einer IList<T> ohne T

Mein Problem gerade: Erstellen einer IList<T> ohne T -- nur typeof(T) ist bekannt.
Lösung:
private static IList GetIListOfGenericType(Type t)
{
Type genericList = typeof (List<>).MakeGenericType(new[] {t});
return (IList)Activator.CreateInstance(genericList);
}

Meine Quelle: Creating generic type object dynamically using reflection

Mittwoch, 19. August 2009

Poll über den verwendeten TestRunner

Habe gerade bei Jamie Cansdale einen Poll über den verwendeten TestRunner gefunden (eigentlich von Fabio Maulo). Nach meinem Vote war ich doch überrascht über die Verteilung: aktuell knapp 40% - ReSharper user dabei....

Dienstag, 18. August 2009

Formatierungen suchen und ersetzen mit Word

Heute mal keinen Code: Ich habe gerade etwas gelernt...
Mit MS Word nach Formatierungen suchen und diese ersetzen:

In meinem Beispiel: Text in Schrifgröße 10 ersetzen durch Schriftgröße 8

In Word "Suchen und Ersetzten", die Erweiterte Ansicht aufklappen...
In "Sonderformat" Suchen nach "beliebiges Zeichen" und Ersetzen durch "Suchen nach Text" (Das ist wohl die Computer-gestützte Übersetzung von " gefundener Text"...)
Dann noch die Formatierungen einstellen - auf beiden Feldern - Fertig:


Ok, also doch noch Code dazu:
Selection.Find.ClearFormatting
Selection.Find.Font.Size = 10
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Size = 8
With Selection.Find
.Text = "^?"
.Replacement.Text = "^&"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

Freitag, 7. August 2009

SyntaxHighlighter

Endlich habe ich es geschafft meinen Sourcecode hier im Blog etwas besser aussehen zu lassen.
Hier habe ich eine erste Idee bekommen.
Allerdings wird dort die Version 1.5.1 des SyntaxHighlighters beschrieben. Auf http://alexgorbatchev.com/wiki/SyntaxHighlighter gibts die aktuellste Version.
Wenn man (wie ich ich) erst nach dem Ersten Post vorgeht und anschließend versucht die aktuellste Version zu verwenden geht erst einmal nichts mehr. Auf der Upgrade Seite steht dann dazu auch was..

Jedenfalls ist der Quellcode nun gut zu lesen..

Wpf ContextMenuNotEnabledBug

Gestern habe ich Probleme gehabt mit einem wpf Bug (?) – In einer Maske (mit wenig Elementen) waren die Einträge des Kontext-Menüs (dessen Items an Commands gebunden waren…) nicht aktiv. Erst Nach einem Klick auf ein Element (aber nicht auch jedes…) wurden die Einträge aktiv.. In meinen Augen ein absolut wirres Verhalten.

Nach langem Suchen habe ich eine Erklärung und ein paar Workarounds gefunden: Bei MSDN und in einem anderen Blog.

Persönlich bin eher für fool-proof (Wenn ich in einem Jahr oder in zweien wieder an den code muss denke ich nicht daran die MenuItems zu “Workarounden”….) und minimal-Invasiv.

Also so wenig wie möglich meinen Code “umbiegen”, nur damit das Kontext-Menü funktioniert. Meine Lösung ist daher:

Im code-behind des wpf-Window:

internal BenutzerVerwaltung()
{
InitializeComponent();
ContextMenuNotEnabledBugHelper.Workaround(this);
}

Dazu der ContextMenuNotEnabledBugHelper:

/// <summary>
/// Helper to Work around the ContextMenu[Not]EnabledBug of wpf.
/// see http://social.msdn.microsoft.com/forums/en-US/wpf/thread/7bd75a7c-eab4-4f3a-967b-94a9534a7455/
/// and http://www.wiredprairie.us/journal/2007/04/commandtarget_menuitem_context.html
/// regarding this...
/// </summary>
public static class ContextMenuNotEnabledBugHelper
{
public static void Workaround(Window window)
{
foreach (object child in RecurseChildren(window))
{
if (HasContextMenu(child))
{
Workaround(window, GetContextMenu(child));
}
}
}

private static bool HasContextMenu(object o)
{
return GetContextMenu(o) != null;
}

private static ContextMenu GetContextMenu(object o)
{
if (o is DependencyObject)
{
return (ContextMenu) ((DependencyObject) o).GetValue(ContextMenuService.ContextMenuProperty);
}
return null;
}

private static void Workaround(Window window, ContextMenu contextMenu)
{
foreach (object o in LogicalTreeHelper.GetChildren(contextMenu))
{
if (o is MenuItem)
{
MenuItem menuItem = (MenuItem) o;
IInputElement oldTarget = menuItem.CommandTarget;
menuItem.CommandTarget = window; // <-- this is the Workaround !
if (oldTarget != null)
{
menuItem.CommandTarget = oldTarget;
}
}
}
}

private static IEnumerable RecurseChildren(DependencyObject current)
{
foreach (object child in LogicalTreeHelper.GetChildren(current))
{
yield return child;
if (child is DependencyObject)
{
foreach (object chlidsChild in RecurseChildren((DependencyObject) child))
{
yield return chlidsChild;
}
}
}
}
}

Also: Meinungen dazu ??

Dienstag, 4. August 2009

Keyboard shortcuts could not be assigned…

Da ich (mal wieder) folgenden Fehler vom ReSharper hatte:

Some keyboard shortcuts could not be assigned because the current keyboard scheme is read only.
Change the keyboard scheme and try again.
clip_image002[5]

Nunja. Das hatte ich schon einmal -- gelöst… Wie nur ??

Das Problem ist, dass die Keyboard-Schemes unter

%ProgramFiles%\Microsoft Visual Studio 9\Common7\IDE\<xxxx>.vsk

liegen. – Und damit standardmäßig (für mich) Schreibgeschützt. Also meinen freundlichen Admin nach schreibrechten auf der Datei gefragt… und “Geht”.

Falls jemand weiß, ob sich die keybindings auch im user-profile speichern lassen, bin ich für jeden Tipp dankbar.