cool IT Team-Blog

Erfahrungen mit WPF Ribbon Libraries

Kürzlich bekam ich die Aufgabe, ein Budgetplanungs Tool mit dem Microsoft WPF Framework (Windows Presentation Foundation) zu entwickeln. Ein Anforderung hierbei war auch, nicht herkömmliche Menüs und Toolbars im Hauptfenster zu implementieren, sondern eine Ribbon Bar zu integrieren, wie sie auch in den neueren Microsoft Office Versionen (Microsoft Office 2007 oder höher) verwendet wird. Also begab ich mich auf die Suche im Internet, ob es hierfür bereits fertige Ribbon Libraries gibt, die eine einfache Integration in .NET WPF Applikationen erlauben.

Ich war erleichert, als ich eine solche Library bei Microsoft finden konnte. Eine Library von derselben Firma, von der auch das .NET Framework stammt, müsste sich doch ohne Probleme in meine Applikation einbinden lassen.

Die Microsoft Ribbon Library für WPF kann man von folgender Internetseite herunterladen:

http://www.microsoft.com/download/en/details.aspx?id=11877

Eine Dokumentation zu dieser Library gibt es auf:

http://msdn.microsoft.com/en-us/library/ff799534.aspx

Beispiel einer Ribbon Bar:

Ribbon.png

Mit Hilfe der mitgelieferten Beispiele war es recht einfach, das geforderte Ribbon-Layout für meine Applikation im XAML-Code umzusetzen. Etwas entäuscht war ich, feststellen zu müssen, dass das Ribbon Design an die Ribbon Bar in Microsoft Office 2007 angelehnt ist und nicht so aussieht, wie in Microsoft Office 2010. Aber damit konnte ich leben.

Mit wesentlich schwerwiegenderen Probleme musste ich mich dann leider beim Implementieren der geforderten Filterfunktionalitäten herumschlagen. Eine recht komplexe Filterfunktionalität erforderte es, bis zu 22 Comboboxen in der Ribbon Bar unterzubringen.

Erstes Problem war, dass nach Auswahl eines Combobox-Eintrages dieses oftmals nicht sofort als ausgewähltes Element sichtbar wurde. Das Auswahlfeld zeigte noch das vorletzte Element. Erst wenn man das gewünschte Element erneut auswählt, erschien es auch im Auswahlfeld. In zwei Fällen war das Problem so gravierend, dass ich die betroffenen Ribbon Comboboxen gegen herkömmliche Comboboxen tauschen musste. In den anderen Comboboxen konnte ich das Problem umgehen, da ich hier eine Multiselect-Fähigkeit vorsehen musste, mit der dieses Problem nur mehr sehr selten auftrat.

Ein weiteres Problem trat beim Verkleinern des Hauptfensters auf, sodass die Ribbon-Gruppen zusammenklappten. In diesem Fall verloren die Comboxen in den kollabierten Ribbon-Gruppen ihre ItemsSource und zeigten keinen Inhalt mehr an. Eine Beschreibung dieses Problems fand ich auch im Internet unter http://wpf.codeplex.com/workitem/14628, jedoch zeigte bei mir der dort vorgeschlagene Workaround leider keine Wirkung. Ich musste also verhindern, dass die Ribbon-Gruppen beim Verändern der Fenstergröße kollabieren was ich mit folgendem XAML-Code erreichen konnte:

  <ribbon:RibbonGroup.GroupSizeDefinitions>
    <ribbon:RibbonGroupSizeDefinition IsCollapsed="False" />
  </ribbon:RibbonGroup.GroupSizeDefinitions>

Das weitaus schlimmste Problem jedoch war ein massiver Performance-Einbruch der Applikation. Die gesamte Applikation reagierte äußerst träge auf Mausklicks und Tastatureingaben. Comboxen in den Eingabemasken (nicht nur im Ribbon!) klappten im Zeitlupentempo ihre Auswahllisten auf und zu. Beim Tippen in Eingabefeldern erschienen die Buchstaben im Sekundenabstand. Ich wusste anfangs nicht, dass dieses Problem von den Ribbon-Comboboxen herrührte und suchte lange nach Optimierungsmöglichkeiten in meiner Applikation. Fast zufällig, als ich einmal das Binding für die Ribbon-Comboboxen abdrehte, bemerkte ich, dass die Applikation wieder sehr rasch reagierte. Ich habe daraufhin die Ribbon-Comboboxen für die Performanceanalyse auf 3 Stück reduziert und die Applikation reagierte immer noch zügig. Als ich jedoch nach und nach wieder alle 22 Ribbon-Comboboxen aktivierte, brach die Performance immer mehr ein bis die Applikation schließlich wieder unerträglich langsam wurde. Anscheinend gibt es hier ein massives Problem in der Speicherverwaltung der Ribbon-Comboboxen. Leider konnte ich keine brauchbare Lösung für dieses Problem finden, es gibt auch von Microsoft keine Hotfixes oder Service Packs zu dieser Ribbon Library.

Ich habe mich daher im Internet nach weiteren Ribbon Libraries umgesehen und bin auf CodePlex fündig geworden:

http://fluent.codeplex.com

Unter obigen Link findet man die Fluent Ribbon Control Suite, die auch das Look & Feel einer Microsoft Office 2010 Ribbon Bar besitzt. Ich studierte die Dokumentation zu dieser Library, verfolgte auch die Diskussionen im dortigen Forum und entschied mich schließlich, es einmal mit dieser Ribbon-Library zu versuchen. Motivierend war hier für mich auch, dass der Source Code zur Verfügung steht, sodass man evtl. auftretende Probleme selber korrigieren kann. Ich spendierte also einen Tag, um meine bestehende Ribbon Bar durch eine Neuimplementierung unter Verwendung der Fluent Ribbon Control Suite zu ersetzen.

Das Ergebnis war sehr vielversprechend und der Umstieg auf jeden Fall der Mühe wert. Meine 22 Ribbon-Comboboxen haben nun keine negative Auswirkung mehr auf die Performance der Applikation und die Ribbon bar sieht zudem noch hübscher aus, als mit der Microsoft Ribbon Library.

Ist doch Cool, oder?

Verfasst: 27.10.2011 11:55:52 von Roland Koller
Tags: .NET WPF Applikationen, Ribbon Bar, WPF, WPF Ribbon Libraries

1


Kommentare
Für diesen Blogbeitrag liegen zurzeit keine Kommentare vor.
Einen Kommentar schreiben



 Security code