none
RibbonSplitButton RRS feed

  • Frage

  • Hi liebe Community ;)
    Ich werke jetzt schon seit Stunden an einer Applikation, welche das Office Ribbon nutzen soll ... Ich möchte in einem Ribbon Tab einen Button erzeugen, welcher sich durch ein DropDownMenü erweitern lassen soll ...
    Es soll wie in folgendem Blog konkret beschrieben funktionieren : http://www.uxpassion.com/2009/02/how-to-use-add-ribbon-to-wpf-applications-part-5/
    Doch das tut es nicht ! Der Button zeigt mir auch den "Erweiterungs - Pfeil" nach unten hin an ... Aber ich kann den Button selbst nicht klicken ?? In den Properties ist lustigerweise die "IsEnabled" Eigenschaft nicht auf "True" gesetzt, ich kann diese aber auch nicht ändern ... Wenn ich dem Button ein Klick - Event hinterlege, in der eine Msg - Box aufgerufen wird tut sich nichts, wenn ich auf den Button klicke ... Ich verwende VS2010 Beta2 und die RibbonControlsLibrary.dll für das Projekt.

    Hoffe Ihr könnt mir helfen, ich komm nicht auf den Fehler ;) 
    Danke schonmal im Voraus ;)
    Grüße, Roland

    <DockPanel LastChildFill="False" Background="#FFDFE9F5" Height="137" VerticalAlignment="Top">
                    <r:Ribbon DockPanel.Dock="Top" Name="RibbonPanel" ShowQuickAccessToolbarOnTop="False">
                        <r:Ribbon.Resources>
                            <r:RibbonCommand x:Key="_Angebotsverwaltung" LabelTitle="Angebotsverwaltung"/>
                        </r:Ribbon.Resources>
                        <r:Ribbon.ApplicationMenu>
                            <r:RibbonApplicationMenu>
                                <r:RibbonApplicationMenuItem Command="{StaticResource _Angebotsverwaltung}"/>
                            </r:RibbonApplicationMenu>
                        </r:Ribbon.ApplicationMenu>
                        <r:RibbonTab Label="Warenwirtschaft">
                            <r:RibbonGroup>
                                <r:RibbonGroup.Command>
                                    <r:RibbonCommand LabelTitle="Details" />
                                </r:RibbonGroup.Command>
                                <r:RibbonSplitButton Command="{StaticResource _Angebotsverwaltung}">                              
                                    <r:RibbonSplitButton.Items>
                                        <MenuItem Header="_Angebot erfassen">
                                            <MenuItem.Icon>
                                                <Image></Image>
                                            </MenuItem.Icon>
                                        </MenuItem>
                                        <MenuItem Header="_Angebot erfassen"/>
                                    </r:RibbonSplitButton.Items>
                                </r:RibbonSplitButton>
                            </r:RibbonGroup>                            
                        </r:RibbonTab>
                    </r:Ribbon>
                </DockPanel>
    

    Freitag, 5. Februar 2010 21:37

Antworten

  • Hi Roland,

    das Problem ist ganz einfach, dass es keine Definition dessen gibt, was beim Ausführen des _Angebotsverwaltung Commands geschehen soll. Sprich, CanExecute ergibt für das Command immer false , dadurch wird dann letztlich IsEnabled auf false gesetzt. Da Du das Command auch noch für einen ApplicationMenuItem hinterlegt hast, sollte auch dieser als "disabled" erscheinen.

    Du musst also entweder ein ICommand definieren, oder einen Click-Handler zuweisen, sodass dort z.B. folgendes steht:

    <r:RibbonCommand x:Key="_Angebotsverwaltung" 
                     LabelTitle="Angebotsverwaltung"
                     Executed="RibbonCommand_Executed"/>

    Das setzt natürlich voraus, dass im code-behind der RibbonCommand_Executed auch vorhanden ist. Also solltest Du diesen nicht einfach per Copy'n'Paste von hier hinzufügen, sondern Intellisense in Deinem XAML verwenden, um den Handler durch VS erzeugen zu lassen.

    Cheers,
    Olaf
    http://blogs.intuidev.com
    Samstag, 6. Februar 2010 10:11

Alle Antworten

  • Hi Roland,

    das Problem ist ganz einfach, dass es keine Definition dessen gibt, was beim Ausführen des _Angebotsverwaltung Commands geschehen soll. Sprich, CanExecute ergibt für das Command immer false , dadurch wird dann letztlich IsEnabled auf false gesetzt. Da Du das Command auch noch für einen ApplicationMenuItem hinterlegt hast, sollte auch dieser als "disabled" erscheinen.

    Du musst also entweder ein ICommand definieren, oder einen Click-Handler zuweisen, sodass dort z.B. folgendes steht:

    <r:RibbonCommand x:Key="_Angebotsverwaltung" 
                     LabelTitle="Angebotsverwaltung"
                     Executed="RibbonCommand_Executed"/>

    Das setzt natürlich voraus, dass im code-behind der RibbonCommand_Executed auch vorhanden ist. Also solltest Du diesen nicht einfach per Copy'n'Paste von hier hinzufügen, sondern Intellisense in Deinem XAML verwenden, um den Handler durch VS erzeugen zu lassen.

    Cheers,
    Olaf
    http://blogs.intuidev.com
    Samstag, 6. Februar 2010 10:11
  • Vielen Dank, Olaf !
    Ich hab zwar wo gelesen, das ich den Executed Befehl "unbedingt" benötige, wusste aber nicht wofür, jetzt ist mir der Sinn klar ;)

    Schöne Grüße ;)
    Roland 
    Samstag, 6. Februar 2010 10:26
  • Ich hätte noch eine kurze Frage ;)
    Ist es möglich, den oberen Executed - Command auch im CodeBehind sozusagen mit AddHandler zu definieren ...
    Ich habe versucht einen SplitButton per Sourcecode zu erzeugen, funktioniert auch, leider endet die Geschichte wieder beim Execute - Command ;)

            Dim NewCommand As New Microsoft.Windows.Controls.Ribbon.RibbonCommand
            NewCommand.LabelTitle = "TestLabel"
            NewCommand.Execute() ........

            Dim NewMenuItem As New System.Windows.Controls.MenuItem
            NewMenuItem.Header = "HelloWorld"

            Dim NewSplitButton As New Microsoft.Windows.Controls.Ribbon.RibbonSplitButton
            NewSplitButton.Command = NewCommand
            NewSplitButton.Items.Add(NewMenuItem)

            Dim NewRibbonGroup As New Microsoft.Windows.Controls.Ribbon.RibbonGroup
            NewRibbonGroup.Controls.Add(NewSplitButton)

            Dim Rtab As New Microsoft.Windows.Controls.Ribbon.RibbonTab
            Rtab.Groups.Add(NewRibbonGroup)
            Rtab.Label = "Stamm"
            RibbonPanel.Tabs.Add(Rtab)

    Was muss ich bei "NewCommand.Execute" schreiben ??

    Grüße, 
    Roland
    Samstag, 6. Februar 2010 21:30
  • Hi Roland,

    IIRC musst Du das über ein CommandBinding regeln. Sprich, ersetze Dein NewCommand.Execute()... durch (air-code):

    Dim cb As New CommandBinding(NewCommand)
    AddHandler cb.Executed, AddressOf NameDerMethode
    

    Bin aber nicht wirklich sicher und kann's momentan nicht ausprobieren.
    Cheers,
    Olaf
    http://blogs.intuidev.com
    Sonntag, 7. Februar 2010 09:02
  • Bekomme den Fehler : "Unable to cast Object of type 'System.Windows.Input.CommandBinding' to type 'System.Windows.Input.ICommand'.

    Source-Code sieht nun so aus :

    Private Sub Create_Buttons()
            Try
                Dim NewCommand As New Microsoft.Windows.Controls.Ribbon.RibbonCommand
                NewCommand.LabelTitle = "TestLabel"
                Dim cb As New CommandBinding(NewCommand)
                AddHandler cb.Executed, AddressOf RibbonCommand_Executed

                Dim NewMenuItem As New System.Windows.Controls.MenuItem
                NewMenuItem.Header = "HelloWorld"

                Dim NewSplitButton As New Microsoft.Windows.Controls.Ribbon.RibbonSplitButton
                NewSplitButton.Command = cb ' Fehlerstelle
                NewSplitButton.Items.Add(NewMenuItem)

                Dim NewRibbonGroup As New Microsoft.Windows.Controls.Ribbon.RibbonGroup
                NewRibbonGroup.Controls.Add(NewSplitButton)

                Dim Rtab As New Microsoft.Windows.Controls.Ribbon.RibbonTab
                Rtab.Groups.Add(NewRibbonGroup)
                Rtab.Label = "Stamm"
                RibbonPanel.Tabs.Add(Rtab)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            
        End Sub

        Private Sub RibbonCommand_Executed(ByVal sender As System.Object, ByVal e As System.Windows.Input.ExecutedRoutedEventArgs)
            MessageBox.Show("")
        End Sub
    Sonntag, 7. Februar 2010 09:13
  • Hi Roland,

    Du musst nicht das CommandBinding (cb ) zuweisen, sondern das RibbonCommand (NewCommand ).

    Cheers,
    Olaf
    http://blogs.intuidev.com
    Sonntag, 7. Februar 2010 12:14
  • ich musste beides zuweisen ;)

     Dim NewSplitButton As New Microsoft.Windows.Controls.Ribbon.RibbonSplitButton
     NewSplitButton.Command = NewCommand
     NewSplitButton.CommandBindings.Add(cb)
     NewSplitButton.Items.Add(NewMenuItem)

    Jetzt funktionierts ;)
    Vielen Dank !
    schöne Grüße,
    Roland

    Sonntag, 7. Februar 2010 14:05