Freigeben über


Migrieren zum Windows-Menübandframework

Eine Anwendung, die auf herkömmlichen Menüs, Symbolleisten und Dialogen basiert, kann zur umfangreichen, dynamischen und kontextgesteuerten Benutzeroberfläche des Windows-Menübandframeworkbefehlssystems migriert werden. Dies ist eine einfache und effektive Möglichkeit, die Anwendung zu modernisieren und zu revitalisieren und gleichzeitig die Barrierefreiheit, Benutzerfreundlichkeit und Auffindbarkeit der Funktionalität zu verbessern.

Einführung

Im Allgemeinen umfasst die Migration einer vorhandenen Anwendung zum Menübandframework Folgendes:

  • Das Entwerfen eines Menübandlayouts und -steuerelements organization, das die Funktionalität der vorhandenen Anwendung verfügbar macht und flexibel genug ist, um neue Funktionen zu unterstützen.
  • Anpassen des Codes der vorhandenen Anwendung.
  • Migrieren vorhandener Anwendungsressourcen (Zeichenfolgen und Images) zum Menübandframework.

Hinweis

Die Richtlinien für die Benutzeroberfläche des Menübands sollten überprüft werden, um festzustellen, ob die Anwendung ein geeigneter Kandidat für eine Menüband-Benutzeroberfläche ist.

 

Entwerfen des Menübandlayouts

Durch Ausführen der folgenden Schritte können Potenzielle Designs und Steuerelementlayouts des Menübands identifiziert werden:

  1. Bestandsaufnahme aller vorhandenen Funktionen.
  2. Übersetzen dieser Funktionalität in Menübandbefehle.
  3. Organisieren der Befehle in logischen Gruppen.

Bestandserfassung

Im Menübandframework wird die von einer Anwendung verfügbar gemachte Funktionalität, die den Zustand oder die Ansicht eines Arbeitsbereichs oder Dokuments bearbeitet, als Befehl betrachtet. Was einen Befehl ausmacht, kann variieren und hängt von der Art und Domäne der vorhandenen Anwendung ab.

Die folgende Tabelle enthält eine Reihe grundlegender Befehle für eine hypothetische Textbearbeitungsanwendung:

Symbol id BESCHREIBUNG
ID_FILE_NEW 0xE100 Neues Dokument
ID_FILE_SAVE 0xE103 Dokument speichern
ID_FILE_SAVEAS 0xE104 Speichern unter... (Dialog)
ID_FILE_OPEN 0xE101 Öffnen... (Dialog)
ID_FILE_EXIT 0xE102 Beenden der Anwendung
ID_EDIT_UNDO 0xE12B Rückgängig
ID_EDIT_CUT 0xE123 Markierten Text ausschneiden
ID_EDIT_COPY 0xE122 Kopieren von ausgewähltem Text
ID_EDIT_PASTE 0xE125 Einfügen von Text aus zwischenablage
ID_EDIT_CLEAR 0xE120 Markierten Text löschen
ID_VIEW_ZOOM 1242 Zoom... (Dialog)

 

Sehen Sie sich beim Erstellen eines Befehlsbestands über vorhandene Menüs und Symbolleisten hinaus. Berücksichtigen Sie alle Möglichkeiten, wie ein Benutzer mit dem Arbeitsbereich interagieren kann. Auch wenn nicht jeder Befehl für die Aufnahme in das Menüband geeignet ist, kann diese Übung sehr gut Befehle verfügbar machen, die zuvor durch Ebenen der Benutzeroberfläche verdeckt wurden.

Übersetzung

Nicht jeder Befehl muss auf der Menüband-Benutzeroberfläche dargestellt werden. Die Eingabe von Text, das Ändern einer Auswahl, das Scrollen oder das Verschieben der Einfügemarke mit der Maus gelten als Befehle im hypothetischen Text-Editor. Diese sind jedoch nicht geeignet, um in einer Befehlsleiste verfügbar zu machen, da jeder eine direkte Interaktion mit der Benutzeroberfläche der Anwendung beinhaltet.

Umgekehrt kann man sich einige Funktionen nicht als Befehl im herkömmlichen Sinne vordenken. Anstatt beispielsweise in einem Dialogfeld zu vergraben, können Seitenrandanpassungen des Druckers im Menüband als Gruppe von Spinner-Steuerelementen in einer kontextbezogenen Registerkarte oder im Anwendungsmodus dargestellt werden.

Hinweis

Notieren Sie sich die numerische ID, die jedem Befehl zugewiesen werden kann. Einige Benutzeroberflächenframeworks, z. B. Microsoft Foundation-Klassen (MFC), definieren IDs für Befehle wie das Datei- und Das Bearbeitungsmenü (0xE100 zu 0xE200).

 

Organisieren

Bevor Sie versuchen, den Befehlsbestand zu organisieren, sollten die Richtlinien für die Benutzeroberfläche des Menübands auf bewährte Methoden beim Implementieren einer Menübandbenutzeroberfläche überprüft werden.

Im Allgemeinen können die folgenden Regeln auf menübandbefehl organization angewendet werden:

  • Befehle, die für die Datei oder die gesamte Anwendung ausgeführt werden, gehören wahrscheinlich in das Anwendungsmenü.
  • Häufig verwendete Befehle wie Ausschneiden, Kopieren und Einfügen (wie im Text-Editor-Beispiel) werden normalerweise auf einer Standardregisterkarte platziert. In komplexeren Anwendungen können sie an anderer Stelle auf der Menübandbenutzeroberfläche dupliziert werden.
  • Wichtige oder häufig verwendete Befehle können die Standardeinfügung in der Symbolleiste für den Schnellzugriff rechtfertigen.

Das Menübandframework stellt auch ContextMenu- und MiniToolbar-Steuerelemente über die ContextPopup-Ansicht bereit. Diese Features sind nicht obligatorisch, aber wenn Ihre Anwendung über ein oder mehrere Kontextmenüs verfügt, kann die Migration der enthaltenen Befehle die Wiederverwendung der vorhandenen Codebasis mit automatischer Bindung an vorhandene Ressourcen ermöglichen.

Da jede Anwendung anders ist, lesen Sie die Richtlinien, und versuchen Sie, sie so weit wie möglich anzuwenden. Eines der Ziele des Menübandframeworks besteht darin, eine vertraute, konsistente Benutzeroberfläche zu bieten, und dieses Ziel ist besser erreichbar, wenn Designs für neue Anwendungen so weit wie möglich vorhandene Menübandanwendungen Spiegel.

Anpassen ihres Codes

Nachdem die Menübandbefehle identifiziert und in logische Gruppierungen organisiert wurden, hängt die Anzahl der Schritte beim Integrieren des Menübandframeworks in vorhandenen Anwendungscode von der Komplexität der ursprünglichen Anwendung ab. Im Allgemeinen gibt es drei grundlegende Schritte:

  • Erstellen Sie das Menübandmarkup basierend auf der Befehls- organization- und Layoutspezifikation.
  • Ersetzen Sie legacy-Menü- und Symbolleistenfunktionen durch Menübandfunktionen.
  • Implementieren Sie einen IUICommandHandler-Adapter.

Erstellen des Markups

Die Liste der Befehle sowie deren organization und Layout werden über die Menübandmarkupdatei deklariert, die vom Markupcompiler des Menübands verwendet wird.

Hinweis

Viele der Schritte, die zum Anpassen einer vorhandenen Anwendung erforderlich sind, ähneln denen, die zum Starten einer neuen Menübandanwendung erforderlich sind. Weitere Informationen finden Sie im Tutorial Erstellen einer Menübandanwendung für eine neue Menübandanwendung.

 

Das Menübandmarkup enthält zwei hauptabschnitte. Der erste Abschnitt ist ein Manifest der Befehle und der zugehörigen Ressourcen (Zeichenfolgen und Bilder). Im zweiten Abschnitt wird die Struktur und Platzierung von Steuerelementen im Menüband angegeben.

Das Markup für den einfachen Text-Editor könnte etwa wie das folgende Beispiel aussehen:

Hinweis

Bild- und Zeichenfolgenressourcen werden weiter unten in diesem Artikel behandelt.

 

<?xml version="1.0" encoding="utf-8"?>
<Application xmlns="http://schemas.microsoft.com/windows/2009/Ribbon">

  <Application.Commands>
    <Command Name="cmdNew" Id="0xE100" Symbol="ID_CMD_NEW" LabelTitle="New document" />
    <Command Name="cmdSave" Id="0xE103" Symbol="ID_CMD_SAVE" LabelTitle="Save" />
    <Command Name="cmdSaveAs" Id="0xE104" Symbol="ID_CMD_SAVEAS" LabelTitle="Save as" />
    <Command Name="cmdOpen" Id="0xE101" Symbol="ID_CMD_OPEN" LabelTitle="Open" />
    <Command Name="cmdExit" Id="0xE102" Symbol="ID_CMD_EXIT" LabelTitle="Exit" />
    <Command Name="cmdUndo" Id="0xE12B" Symbol="ID_CMD_UNDO" LabelTitle="Undo" />
    <Command Name="cmdCut" Id="0xE123" Symbol="ID_CMD_CUT" LabelTitle="Cut" />
    <Command Name="cmdCopy" Id="0xE122" Symbol="ID_CMD_COPY" LabelTitle="Copy" />
    <Command Name="cmdPaste" Id="0xE125" Symbol="ID_CMD_PASTE" LabelTitle="Paste" />
    <Command Name="cmdDelete" Id="0xE120" Symbol="ID_CMD_DELETE" LabelTitle="Delete" />
    <Command Name="cmdZoom" Id="1242" Symbol="ID_CMD_ZOOM" LabelTitle="Zoom" />
  </Application.Commands>

  <Application.Views>
    <Ribbon>
      <Ribbon.ApplicationMenu>
        <ApplicationMenu>
          <MenuGroup>
            <Button CommandName="cmdNew" />
            <Button CommandName="cmdOpen" />
            <Button CommandName="cmdSave" />
            <Button CommandName="cmdSaveAs" />
          </MenuGroup>
          <MenuGroup>
            <Button CommandName="cmdExit" />
          </MenuGroup>
        </ApplicationMenu>
      </Ribbon.ApplicationMenu>
      <Ribbon.QuickAccessToolbar>
        <QuickAccessToolbar>
          <QuickAccessToolbar.ApplicationDefaults>
            <Button CommandName="cmdSave" />
            <Button CommandName="cmdUndo" />
          </QuickAccessToolbar.ApplicationDefaults>
        </QuickAccessToolbar>
      </Ribbon.QuickAccessToolbar>
      <Ribbon.Tabs>
        <Tab>
          <Group CommandName="grpClipboard" SizeDefinition="FourButtons">
            <Button CommandName="cmdPaste" />
            <Button CommandName="cmdCut" />
            <Button CommandName="cmdCopy" />
            <Button CommandName="cmdDelete" />
          </Group>
        </Tab>
        <Tab>
          <Group CommandName="grpView" SizeDefinition="OneButton">
            <Button CommandName="cmdZoom" />
          </Group>
        </Tab>
      </Ribbon.Tabs>
    </Ribbon>
  </Application.Views>

</Application>

Um zu vermeiden, dass Symbole, die von einem Benutzeroberflächenframework wie MFC definiert werden, neu definiert werden, verwendet das vorherige Beispiel geringfügig andere Symbolnamen für jeden Befehl (ID_FILE_NEW im Vergleich zu ID_CMD_NEW). Die numerische ID, die jedem Befehl zugewiesen ist, muss jedoch gleich bleiben.

Um die Markupdatei in eine Anwendung zu integrieren, konfigurieren Sie einen benutzerdefinierten Buildschritt, um den Markupcompiler des Menübands auszuführen, UICC.exe. Die resultierenden Header- und Ressourcendateien werden dann in das vorhandene Projekt integriert. Wenn die Beispiel-Text-Editor-Menübandanwendung den Namen "RibbonPad" trägt, ist eine benutzerdefinierte Build-Befehlszeile wie die folgende erforderlich:

UICC.exe res\RibbonPad_ribbon.xml res\RibbonPad_ribbon.bin 
         /header:res\RibbonPad_ribbon.h /res:res\RibbonPad_ribbon.rc2

Der Markupcompiler erstellt eine Binärdatei, eine Headerdatei (H) und eine Ressourcendatei (RC). Da die vorhandene Anwendung wahrscheinlich über eine vorhandene RC-Datei verfügt, schließen Sie die generierten H- und RC-Dateien in diese RC-Datei ein, wie im folgenden Beispiel gezeigt:

#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//

#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#pragma code_page(1252)

#include "res\RibbonPad_ribbon.h"  // Ribbon resources
#include "res\RibbonPad_ribbon.rc2"  // Ribbon resources

#include "res\RibbonPad.rc2"  // non-Microsoft Visual C++ edited resources
#include "afxres.rc"    // Standard components
#include "afxprint.rc"  // printing/print preview resources
#endif
#endif    // not APSTUDIO_INVOKED

Ersetzen von Legacymenüs und Symbolleisten

Das Ersetzen von Standardmenüs und Symbolleisten durch ein Menüband in einer Legacyanwendung erfordert Folgendes:

  1. Entfernen Sie Symbolleisten- und Menüressourcenverweise aus der Ressourcendatei der Anwendung.
  2. Löschen Sie den gesamten Symbolleisten- und Menüleisteninitialisierungscode.
  3. Löschen Sie code, der zum Anfügen einer Symbolleiste oder Menüleiste an das Fenster der obersten Ebene der Anwendung verwendet wird.
  4. Instanziieren Sie das Menübandframework.
  5. Fügen Sie das Menüband an das Fenster der obersten Ebene der Anwendung an.
  6. Laden Sie das kompilierte Markup.

Wichtig

Vorhandene status Balken- und Tastenkombinationstabellen sollten beibehalten werden, da das Menübandframework diese Features nicht ersetzt.

 

Im folgenden Beispiel wird veranschaulicht, wie Sie das Framework mithilfe von IUIFramework::Initialize initialisieren:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    if (!m_RibbonBar.Create(this, WS_CHILD|WS_DISABLED|WS_VISIBLE|CBRS_TOP|CBRS_HIDE_INPLACE,0))
        return -1;      // fail to create

    if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
        return -1;      // fail to create

    // Ribbon initialization
    InitRibbon(this, &m_spUIFramework);

    return 0;
}

Im folgenden Beispiel wird veranschaulicht, wie IUIFramework::LoadUI zum Laden des kompilierten Markups verwendet wird:

HRESULT InitRibbon(CMainFrame* pMainFrame, IUnknown** ppFramework)
{
    // Create the IUIFramework instance.
    CComPtr<IUIFramework> spFramework;
    HRESULT hr = ::CoCreateInstance(CLSID_UIRibbonFramework, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&spFramework));
    if (FAILED(hr))
        return hr;
    
    // Instantiate the CApplication object.
    CComObject<CApplication>* pApplication;
    hr = CComObject<CApplication>::CreateInstance(&pApplication);   // Refcount is 0
    
    // Call AddRef on the CApplication object. The smart pointer will release the refcount when it is out of scope.
    CComPtr< CComObject<CApplication> > spApplication(pApplication);

    if (FAILED(hr))
        return hr;

    // Initialize and load the Ribbon.
    spApplication->Initialize(pMainFrame);

    hr = spFramework->Initialize(*pMainFrame, spApplication);
    if (FAILED(hr))
        return hr;

    hr = spFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON");
    if (FAILED(hr))
        return hr;

    // Return IUIFramework interface to the caller.
    hr = spFramework->QueryInterface(ppFramework);

    return hr;
}

Die oben erwähnte CApplication-Klasse muss ein Paar von COM-Schnittstellen (Component Object Model) implementieren, die vom Menübandframework definiert sind: IUIApplication und IUICommandHandler.

IUIApplication stellt die Standard Rückrufschnittstelle zwischen dem Framework und der Anwendung bereit (z. B. wird die Höhe des Menübands über IUIApplication::OnViewChanged kommuniziert), während die Rückrufe für einzelne Befehle als Antwort auf IUIApplication::OnCreateUICommand bereitgestellt werden.

Tipp: Einige Anwendungsframeworks, z. B. MFC, erfordern, dass die Höhe der Menübandleiste beim Rendern des Dokumentraums der Anwendung berücksichtigt wird. In diesen Fällen ist das Hinzufügen eines ausgeblendeten Fensters erforderlich, um die Menübandleiste zu überlagern und den Dokumentraum auf die gewünschte Höhe zu zwingen. Ein Beispiel für diesen Ansatz, bei dem eine Layoutfunktion basierend auf der von der IUIRibbon::GetHeight-Methode zurückgegebenen Menübandhöhe aufgerufen wird, finden Sie im HTMLEditRibbon-Beispiel.

Im folgenden Codebeispiel wird eine IUIApplication::OnViewChanged-Implementierung veranschaulicht:

// This is the Ribbon implementation that is done by an application.
// Applications have to implement IUIApplication and IUICommandHandler to set up communication with the Windows Ribbon.
class CApplication
    : public CComObjectRootEx<CComSingleThreadModel>
    , public IUIApplication
    , public IUICommandHandler
{
public:

    BEGIN_COM_MAP(CApplication)
        COM_INTERFACE_ENTRY(IUIApplication)
        COM_INTERFACE_ENTRY(IUICommandHandler)
    END_COM_MAP()

    CApplication() : _pMainFrame(NULL)
    {
    }

    void Initialize(CMainFrame* pFrame)
    {
        // Hold a reference to the main frame.
        _pMainFrame = pFrame;
    }

    void FinalRelease()
    {
        // Release the reference.
        _pMainFrame = NULL;
        __super::FinalRelease();
    }

    STDMETHOD(OnViewChanged)(UINT32 nViewID, __in UI_VIEWTYPE typeID, __in IUnknown* pView, UI_VIEWVERB verb, INT32 uReasonCode)
    {
        HRESULT hr;

        // The Ribbon size has changed.
        if (verb == UI_VIEWVERB_SIZE)
        {
            CComQIPtr<IUIRibbon> pRibbon = pView;
            if (!pRibbon)
                return E_FAIL;

            UINT ulRibbonHeight;
            // Get the Ribbon height.
            hr = pRibbon->GetHeight(&ulRibbonHeight);
            if (FAILED(hr))
                return hr;

            // Update the Ribbon bar so that the main frame can recalculate the child layout.
            _pMainFrame->m_RibbonBar.SetRibbonHeight(ulRibbonHeight);
            _pMainFrame->RecalcLayout();
        }

        return S_OK;
    }

    STDMETHOD(OnCreateUICommand)(UINT32 nCmdID, 
                               __in UI_COMMANDTYPE typeID,
                               __deref_out IUICommandHandler** ppCommandHandler)
    {
        // This application uses one command handler for all ribbon commands.
        return QueryInterface(IID_PPV_ARGS(ppCommandHandler));
    }

    STDMETHOD(OnDestroyUICommand)(UINT32 commandId, __in UI_COMMANDTYPE typeID,  __in_opt  IUICommandHandler *commandHandler)
    {        
        return E_NOTIMPL;
    }

private:
    CMainFrame* _pMainFrame;
};

Implementieren eines IUICommandHandler-Adapters

Je nach Entwurf der ursprünglichen Anwendung kann es einfacher sein, mehrere Command-Handlerimplementierungen oder einen einzelnen Bridging Command-Handler zu verwenden, der die Befehlslogik der vorhandenen Anwendung aufruft. Viele Anwendungen verwenden zu diesem Zweck WM_COMMAND Nachrichten, bei denen es ausreicht, einen einzigen Allzweckbefehlshandler bereitzustellen, der einfach WM_COMMAND Nachrichten an das Fenster der obersten Ebene weiterleitet.

Dieser Ansatz erfordert jedoch eine spezielle Behandlung für Befehle wie Beenden oder Schließen. Da das Menüband während der Verarbeitung einer Fensternachricht nicht zerstört werden kann, sollte die WM_CLOSE Nachricht an den UI-Thread der Anwendung gesendet und nicht synchron verarbeitet werden, wie im folgenden Beispiel gezeigt:

// User action callback, with transient execution parameters.
    STDMETHODIMP Execute(UINT nCmdID,
        UI_EXECUTIONVERB verb, 
        __in_opt const PROPERTYKEY* key,
        __in_opt const PROPVARIANT* ppropvarValue,
        __in_opt IUISimplePropertySet* pCommandExecutionProperties)
    {       
        switch(nCmdID)
        {
        case cmdExit:
            ::PostMessage(*_pMainFrame, WM_CLOSE, nCmdID, 0);
            break;
        default:
            ::SendMessage(*_pMainFrame, WM_COMMAND, nCmdID, 0);
        }
        return S_OK;
    }

    STDMETHODIMP UpdateProperty(UINT32 nCmdID, 
                                __in REFPROPERTYKEY key,
                                __in_opt  const PROPVARIANT *currentValue,
                                __out PROPVARIANT *newValue) 
    {        
        return S_OK;
    }

Migrieren von Ressourcen

Wenn das Manifest von Befehlen definiert, die Struktur des Menübands deklariert und der Anwendungscode zum Hosten des Menübandframeworks angepasst wurde, ist der letzte Schritt die Spezifikation der Zeichenfolgen- und Bildressourcen für jeden Befehl.

Hinweis

Zeichenfolgen- und Bildressourcen werden in der Regel in der Markupdatei bereitgestellt. Sie können jedoch programmgesteuert generiert oder ersetzt werden, indem die IUICommandHandler::UpdateProperty-Rückrufmethode implementiert wird.

 

Zeichenfolgenressourcen

Command.LabelTitle ist die am häufigsten für einen Befehl definierte Zeichenfolgeneigenschaft. Diese werden als Textbeschriftungen für Registerkarten, Gruppen und einzelne Steuerelemente gerendert. Eine Bezeichnungszeichenfolge aus einem Legacymenüelement kann in der Regel ohne große Bearbeitung für ein Command.LabelTitle-Element wiederverwendet werden.

Die folgenden Konventionen haben sich jedoch mit dem Aufkommen des Menübands geändert:

  • Das Suffix mit den Auslassungspunkten (...), das zum Anzeigen eines Dialogstartbefehls verwendet wird, ist nicht mehr erforderlich.
  • Ampersand (&) kann weiterhin verwendet werden, um eine Tastenkombination für einen Befehl anzugeben, der in einem Menü angezeigt wird, aber die vom Framework unterstützte Command.Keytip-Eigenschaft erfüllt einen ähnlichen Zweck.

Wenn Sie auf das Beispiel des Text-Editors verweisen, können die folgenden Zeichenfolgen für LabelTitle und Keytip angegeben werden:

Symbol Ursprüngliche Zeichenfolge LabelTitle-Zeichenfolge KeyTIP-Zeichenfolge
ID_FILE_NEW &Neu &Neu N
ID_FILE_SAVE &Speichern &Speichern E
ID_FILE_SAVEAS Speichern unter &... Speichern unter & A
ID_FILE_OPEN &Öffnen... &Öffnen O
ID_FILE_EXIT Been&den Been&den X
ID_EDIT_UNDO &Rückgängig Rückgängig Z
ID_EDIT_CUT Cu&t Cu&t X
ID_EDIT_COPY &Kopieren &Kopieren C
ID_EDIT_PASTE &Einfügen &Einfügen V
ID_EDIT_CLEAR &Löschen &Löschen D
ID_VIEW_ZOOM &Zoom... Zoom Z

 

Im Folgenden finden Sie eine Liste anderer Zeichenfolgeneigenschaften, die für die meisten Befehle festgelegt werden sollten:

Registerkarten, Gruppen und andere Features der Menüband-Benutzeroberfläche können jetzt mit allen angegebenen Zeichenfolgen- und Bildressourcen deklariert werden.

Im folgenden Menübandmarkupbeispiel werden verschiedene Zeichenfolgenressourcen veranschaulicht:

<Application.Commands>
    <!-- Tabs -->
    <Command Name="tabHome" LabelTitle="Home" Keytip="H" />
    <Command Name="tabView" LabelTitle="View" Keytip="V" />

    <!-- Groups -->
    <Command Name="grpClipboard" LabelTitle="Clipboard" />
    <Command Name="grpZoom" LabelTitle="Zoom" />

    <!-- App menu commands -->
    <Command Name="cmdNew" Id="0xE100" Symbol="ID_CMD_NEW" LabelTitle="New document" Keytip="N" >
      <Command.TooltipTitle>New (Ctrl+N)</Command.TooltipTitle>
      <Command.TooltipDescription>Create a new document.</Command.TooltipDescription>
    </Command>
    <Command Name="cmdSave" Id="0xE103" Symbol="ID_CMD_SAVE" LabelTitle="Save" Keytip="S">
      <Command.TooltipTitle>Save (Ctrl+S)</Command.TooltipTitle>
      <Command.TooltipDescription>Save the current document.</Command.TooltipDescription>
    </Command>
    <Command Name="cmdSaveAs" Id="0xE104" Symbol="ID_CMD_SAVEAS" LabelTitle="Save as" Keytip="A">
      <Command.TooltipDescription>Save the current document with a new name.</Command.TooltipDescription>
    </Command>
    <Command Name="cmdOpen" Id="0xE101" Symbol="ID_CMD_OPEN" LabelTitle="Open" Keytip="O">
      <Command.TooltipTitle>Open (Ctrl+O)</Command.TooltipTitle>
      <Command.TooltipDescription>Open a document.</Command.TooltipDescription>
    </Command>
    <Command Name="cmdExit" Id="0xE102" Symbol="ID_CMD_EXIT" LabelTitle="Exit" Keytip="X">
      <Command.TooltipDescription>Exit the application.</Command.TooltipDescription>
    </Command>

    <!-- ...other commands -->

  </Application.Commands>

Bildressourcen

Das Menübandframework unterstützt Bildformate, die ein wesentlich reichhaltigeres Erscheinungsbild bieten als die Bildformate, die von vorherigen Menü- und Symbolleistenkomponenten unterstützt werden.

Für Windows 8 und höher unterstützt das Menübandframework die folgenden Grafikformate: 32-Bit-ARGB-Bitmapdateien (BMP) und PNG-Dateien (Portable Network Graphics) mit Transparenz.

Für Windows 7 und früher müssen Bildressourcen dem in Windows verwendeten Standard-BMP-Grafikformat entsprechen.

Hinweis

Vorhandene Bilddateien können in beide Formate konvertiert werden. Die Ergebnisse können jedoch weniger als zufriedenstellend sein, wenn die Bilddateien keine Antialiasing und Transparenz unterstützen.

 

Es ist nicht möglich, eine einzelne Standardgröße für Bildressourcen im Menübandframework anzugeben. Zur Unterstützung des adaptiven Layouts von Steuerelementen können Bilder jedoch in zwei Größen (groß und klein) angegeben werden. Alle Bilder im Menübandframework werden entsprechend der Dpi-Auflösung (Dots per Inch) der Anzeige skaliert, wobei die genaue gerenderte Größe abhängig von dieser DPI-Einstellung ist. Weitere Informationen finden Sie unter Angeben von Menübandbildressourcen .

Im folgenden Beispiel wird veranschaulicht, wie im Markup auf eine Gruppe von dpi-spezifischen Bildern verwiesen wird:

<Command Name="cmdNew" Id="0xE100" Symbol="ID_CMD_NEW" LabelTitle="New document" Keytip="N" >
      <Command.TooltipTitle>New (Ctrl+N)</Command.TooltipTitle>
      <Command.TooltipDescription>Create a new document.</Command.TooltipDescription>
      <Command.LargeImages>
        <Image Source="cmdNew-32px.png" MinDPI="96" />
        <Image Source="cmdNew-40px.png" MinDPI="120" />
        <Image Source="cmdNew-48px.png" MinDPI="144" />
        <Image Source="cmdNew-64px.png" MinDPI="192" />
      </Command.LargeImages>
      <Command.SmallImages>
        <Image Source="cmdNew-16px.png" MinDPI="96" />
        <Image Source="cmdNew-20px.png" MinDPI="120" />
        <Image Source="cmdNew-24px.png" MinDPI="144" />
        <Image Source="cmdNew-32px.png" MinDPI="192" />
      </Command.SmallImages>
    </Command>

Angeben von Menübandbildressourcen