WPF Borderless Window

Wenn man mit Hilfe von WPF Applikationen mit einem modernen Design bauen will, hat man mit den in WPF angebotenen Styles so seine Probleme. Wenn man z.B. eine Applikation mit Office 2013 Style bauen will, benötigt man in WPF ein sogenanntes “Borderless Window”, also ein Fenster ohne den unschönen dicken Rahmen. Hier leistet die frei verfügbare MahApps-Bibliothek gesponsert von der Firma AIT gute Dienste: http://mahapps.com/MahApps.Metro/.

BorderlessWindow

Neben den Styles bietet die Bibliothek auch einige sehr interessante neue Steuerelemente wie z.B. “Panorama”. Panorama ist eine seitwärts scrollende Liste, wie sie z.B. vom Windows 8 Startbildschirm bekannt ist:

Panorama

Advertisements

C# String Replace

Leider bietet die String.Replace – Methode nicht die Möglichkeit mit IgnoreCase zu arbeiten:

StringReplace

Funktioniert leider OFTB nicht:

string test = "Hallo Dieter";
test = test.Replace("dieter", "Thomas", StringComparer.CurrentCultureIgnoreCase);

Glücklicherweise gibt es Hilfe im NameSpace “System.Text.RegularExpressions“:

Funktioniert:

string test = "Hallo Dieter";
test = Regex.Replace(test, "dieter", "Thomas", RegexOptions.IgnoreCase);

Wer besonders smart ist, kann sich damit eine Erweiterungsmethode basteln. Dann bekommt man auch den oberen Quelltext an den Start!

WPF Favorite Button

With this post I want to present c# source code for implementing a favorite button in WPF.

An empty favorite button becomes visible on moving the mouse into the window pane. You’ll also get a tooltip “add to favorites”:

Favorite1

On clicking the favorite button you get the following with tooltip “remove from favorites”:

Favorite2

SourceCode:

<Window x:Class="FavoriteButton.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Favoriten" Height="160" Width="160" ResizeMode="NoResize">

    <Window.Resources>
        <BitmapImage x:Key="Star" UriSource="/Images/star.png" />
        <BitmapImage x:Key="StarEmpty" UriSource="/Images/star empty.png" />
    </Window.Resources>

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <ToggleButton Focusable="False" HorizontalAlignment="Left" Margin="55,40,0,0"  VerticalAlignment="Top" Width="40" Height="40" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsTabStop="False" >
            <ToggleButton.Style>
                <Style TargetType="{x:Type ToggleButton}">                                       
                    <Setter Property="HorizontalContentAlignment" Value="Center"/>
                    <Setter Property="VerticalContentAlignment" Value="Center"/>                 
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ToggleButton}">
                                <Border>
                                    <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                                      RecognizesAccessKey="True"                                                   
                                                      HorizontalAlignment="Center"/>
                                </Border>
                                
                                <ControlTemplate.Triggers>                                                                     
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding = "{Binding ElementName=LayoutRoot, Path=IsMouseOver}" Value="True" />
                                            <Condition Binding = "{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="False" />
                                            <Condition Binding = "{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsEnabled}" Value="True" />
                                        </MultiDataTrigger.Conditions>

                                        <Setter Property="Content">
                                            <Setter.Value>                                                
                                                    <Image Source="{StaticResource StarEmpty}"/>                                                
                                            </Setter.Value>                                            
                                        </Setter>
                                        <Setter Property="ToolTip" Value="Zu Favoritenliste hinzufügen"/>
                                    </MultiDataTrigger>                                      

                                    <Trigger  Property="IsChecked" Value="True">
                                        <Setter Property="Content">
                                            <Setter.Value>                                                
                                                    <Image Source="{StaticResource Star}"/>
                                            </Setter.Value>
                                        </Setter>
                                        <Setter Property="ToolTip" Value="Aus Favoritenliste entfernen"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ToggleButton.Style>            
        </ToggleButton>
    </Grid>
</Window>

TFS 2012 Neue Features

Nr. Neues Feature Beschreibung
1 Lokale Workspaces Lokale Workspaces erleichtern die Offline-Arbeit. Files sind bei lokalen Workspaces nicht mehr ReadOnly. Metadaten über den jeweiligen Zustand der Dateien werden in einem versteckten Ordner gehalten. Server Workspaces gibt es unter TFS 2012 auch noch. Per Default werden in TFS 2012 aber jetzt lokale Workspaces verwendet. Weitere Infos unter http://visualstudiomagazine.com/articles/2012/11/02/local-workspaces-in-tfs-2012.aspx
 2 Async Checkout Asynchroner Checkout sorgt dafür, dass das Auschecken bei Server Workspaces im Hintergrund läuft. Dadurch kann man etwas schneller mit dem Bearbeiten von Source Code beginnen.
 3 Merge on Unshelve Shelvesets können jetzt wieder im Workspace abgelegt werden auch wenn zwischenzeitlich neue lokale Änderungen vorhanden sind. Mögliche Konflikte können mit einem entsprechenden Dialog wie auch sonst üblich aufgelöst werden.
 4 Meine Arbeit Zeigt in übersichtlicher Form die aktuell anstehende eigene Arbeit an. Man kann relativ einfach Work Items in Bearbeitung nehmen und deren Bearbeitung auch wieder anhalten. Außerdem kann man Codeüberprüfungen anfordern. Ab VS 2012 Premium Edition verfügbar.MyWork
 5 Projektwarnungen Webbasiertes Tool zum Einrichten von Projektwarnungen. Löst das entsprechende Powertool von TFS 2010 ab.Alerts1Alerts2
 6 Agile / Scrum Features
  • Scrum 2.0 Template (inkl. Product Backlog und Sprints)
  • Webbasiertes Taskboard
  • Team Home Page mit Burn Down Chart
 7 Storyboarding Fügt den WorkItems ein StoryBoarding Tab hinzu. Ab Visual Studio Premium Edition verfügbar.
 8 Feedback Es gibt einen separaten Feedback Client für TFS 2012 zum kostenlosen Download: http://www.microsoft.com/en-us/download/details.aspx?id=30660.

 

Siehe auch: https://knabben.wordpress.com/2013/03/07/tfs-2012-feedback-client/

 9 Microsoft Test Manager Im Microsoft Test Manager gibt es in Verbindung mit TFS 2012 neue Features:

  • Neue Reports im Test Manager
  • Zusätzliche Lab Management Features
  • Bessere Unterstützung beim Exploratory Testing
Weitere Infos: http://blogs.msdn.com/b/buckh/archive/2012/06/07/visual-studio-2012-features-enabled-by-using-a-tfs-2012-server.aspx

Active Directory Benutzer und Gruppen auswählen

ADAuswahl

Wie man den Standarddialog zum Auswählen von Benutzern und Gruppen aus einem .Net-Programm aufrufen kann, wird in folgendem Codeplex-Beitrag gezeigt: http://adui.codeplex.com/

Der Sourcecode enthält aber noch einige kleinere Probleme. Insbesondere funktioniert das Ganze momentan nicht auf 64-Bit-Systemen. Dort kommt es nach der Auswahl und dem Bestätigen mit dem OK-Button zu einem Absturz. Wie man den Quelltext anpassen muss, wird in dem folgenden Beitrag erläutert: http://adui.codeplex.com/discussions/38047?ProjectName=adui

Einfach die Anmerkung von BlairAllenStark vom Mar 9 at 7:54 PM einarbeiten.

StringEnum in C#

Von Zeit zu Zeit wünscht man sich als C# Developer, dass man für Enumerationen auch sogenannte StringValues definieren kann. Leider geht das mit C# nicht Out of the Box. Im Internet findet man diesbezüglich bereits entsprechende Bibliotheken inkl. Sourcecode. Ich habe diesen Code noch ein bischen optimiert und mit StyleCop überarbeitet. Man kann meine “StringEnumType” – Library nun folgendermaßen verwenden:

StringEnum

Wer Verwendung für diese Geschichte hat, kann mich einfach per Email
kontaktieren. Ich werde die dll dann zusenden.

WPF RichTextBox mit Toolbar

RTFBox

In WPF gibt es zwar ein RichtTextBox-Control. Leider besitzt dieses jedoch keine Toolbar. Außerdem ist diese für den Einsatz mit MVVM leider kaum geeignet, da Sie keine Bindable Document Eigenschaft besitzt. Abhilfe schafft hier das folgende Control von David Veeneman:

http://www.codeproject.com/Articles/66054/A-Bindable-WPF-RichTextBox

Leider kann man mit dem aktuellen Download die Toolbar nicht bei Bedarf ausblenden. Außerdem gibt es keine ReadOnly-Eigenschaft. Diese Probleme kann man aber mit geringfügigen Anpassungen im Code lösen (siehe dazu auch die Kommentare). Leider gibt es noch kleinere Probleme beim Aktualisieren der Toolbar. Diese sollten sich aber auch noch lösen lassen.

Microsoft Word Password Bug

Word2007

Bei Microsoft Word gibt es ab 2007 SP2 und auch noch in Word 2010 einen recht unschönen Bug bei der Office-Automation über den ich vor einiger Zeit gestolpert bin:

Offenbar merkt sich Word ein einmal vergebenes Password solange das Dokument im Speicher geladen ist. Wenn man dann den Befehl – ActiveDocument.Protect 2, True, “” – absetzt und das Dokumet danach speichert, wird beim nächsten Öffnen des Dokuments fälschlicherweise das ursprüngliche Password verlangt. Und das obwohl man mit dem o.g. “Protect” – Befehl explizit kein Passwort gesetzt hat.

Eine genaue Beschreibung des Problems befindet sich hier: http://social.msdn.microsoft.com/Forums/en/worddev/thread/f9b8408d-ed73-4e84-ac78-54526ceb5037

Mit Reload kann man dieses Problem umgehen. Dann werden aber auch alle Events wieder ausgelöst!

Weitere Infos unter: http://www.bigresource.com/VB-Word-Automation-Removing-formatting-EBHZcUAqdH.html#6DyNXrX408 und http://www.tech-archive.net/Archive/Word/microsoft.public.word.vba.general/2010-05/msg00378.html

OpenXML SDK and Windows 8 Store App

OpenXMLSDKForWinRT

Unfortunatly the OpenXML SDK 2.0 and 2.5 rely on .Net Framework namespaces (e.g. System.Xaml) which are not available for Windows 8 Store apps. So at the moment there is no way to use the OpenXML SDK in WinRT. As an alternative one has to use classes like ZipArchive in namespace System.Compression (see e.g.  http://lunarfrog.com/blog/2013/01/21/deploying-zipped-data/) for compressing and decompressing packaged .docx-files in combination with LinQToXML for reading, adding or updating content. It would be very nice if Microsoft could release a new version of the SDK compatible with WinRT. That would make things definitely much easier.

OpenXML MSDN Webcasts

Wer tiefer in die Materie OpenXML einsteigen möchte, dem empfehle ich die beiden folgenden Webcast-Serien von Jens Häupel:

Word: https://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-0901-02.mspx

Excel: http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-1103-01.mspx

Sie wurden allerdings noch auf Basis des OpenXML SDK 2.0 erstellt. Trotzdem liefern beide Webcast-Serien einen sehr guten Einstieg in die Materie.