none
Ribbon menu

    Dotaz

  • Zdravím.

    Mám problém na který nemohu najít na internetu žádny návod.

    Jedná se o aplikaci psanou ve WPF s Riboon menu a potřebuji u něj dynamicky měnit tlačítko Enabled/Disabled v RibbonButton. Nemáte někdo s tím nějaké zkušenosti ?

    Díky

    28. listopadu 2009 11:07

Odpovědi

  • Zjistil jsem, že to funguje velmi jednoduše, přinejmenším v uvedené ukázce: kdykoli v kódu v C# nastavím hodnotu proměnné mblnFiltrJeZapnuty , odpovídající tlačítko na pásu karet se adekvátně zpřístupní nebo znepřístupní. Hodnotu můžu nastavit jak v rámci kódu volaného z ribbonu, tak z jakékoli události vyvolané jiným prvkem.
    Takže vztaženo na váš případ, postupoval bych takto:
    <rbn:RibbonCommand x:Key="UlozitCommand"
     CanExecute="UlozitCommand_CanExecute"
     Executed="UlozitCommand_Executed"
     LabelTitle="Uložit"
     LargeImageSource="Images\Save.png"
     SmallImageSource="Images\Small\Save.png"
     ToolTipTitle="Uložit dokument"
     ToolTipDescription="Uloží aktuální dokument." />
    
    V kódu by pak měly být tyto položky:
    private bool mblnUlozeno;
    
    private void UlozitCommand_CanExecute(object target, CanExecuteRoutedEventArgs args) {
       args.CanExecute = !mblnUlozeno;
      }
    
    private void UlozitCommand_Executed(object target, CanExecuteRoutedEventArgs args) {
      if(!mblnUlozeno)
         mdcDokument.Ulozit();
       mblnUlozeno = true;
      }
    
    //ještě je potřeba doplnit kód, který reaguje na změny dokumentu a nastavuje hodnotu mblnUlozeno na false



    Boris Lehečka (Word, VBA, XML, C#, SQL)
    13. prosince 2009 22:14

Všechny reakce

  • S jakým ribbonem pracujete? Předpokládám, že s komponentou od Microsoftu . V čem spočívá ona dynamičnost změny? Na co je potřeba reagovat, aby se tlačítko z(ne)přístupnilo?
    Možná by pomohlo využití objektu Command, který se ve XAMLu zapíše např. takto
    <rbn:RibbonCommand x:Key="ZrusitFiltrCommand"
     CanExecute="ZrusitFiltrCommand_CanExecute"
     Executed="ZrusitFiltrCommand_Executed"
     LabelTitle="Zrušit"
     LargeImageSource="Images\Clear.png"
     SmallImageSource="Images\Clear.png"
     ToolTipTitle="Zrušit filtr"
     ToolTipDescription="Zruší nastavené filtry v tabulkách." />
    
    
    U přepínacího tlačítka pak definujete, na jaký příkaz má toto tlačítko reagovat:
    <rbn:RibbonButton Command="{StaticResource ZrusitFiltrCommand}"/>
    A v kódu pak samozřejmě ještě musíte definovat metodu ZrusitFiltrCommand_CanExecute , která vrací hodnotu true (tlačítko je aktivní), nebo false (tlačítko je neaktivní), např. takto:
    private void ZrusitFiltrCommand_CanExecute(object target, CanExecuteRoutedEventArgs args) {
    args.CanExecute = mblnFiltrJeZapnuty;
    }


    Boris Lehečka (Word, VBA, XML, C#, SQL)
    2. prosince 2009 21:37
  • Ano Je to komponenta od Microsoftu.

    Asi jsem to špatně popsal.

    V XAMLu mám celý Ribbon a nastavené CanExecute na procedury. Ale za běhu programu potřebuji zakázat nebo povolit  uložení dokumentu v případě že je dokument již uložen. Zatím to řeším hodnotou true/false a dialogovým oknem. Netuším jak pracovat s ribbon tlačítky pomocí C#.

    Díky za odpověď.
    13. prosince 2009 20:31
  • Zjistil jsem, že to funguje velmi jednoduše, přinejmenším v uvedené ukázce: kdykoli v kódu v C# nastavím hodnotu proměnné mblnFiltrJeZapnuty , odpovídající tlačítko na pásu karet se adekvátně zpřístupní nebo znepřístupní. Hodnotu můžu nastavit jak v rámci kódu volaného z ribbonu, tak z jakékoli události vyvolané jiným prvkem.
    Takže vztaženo na váš případ, postupoval bych takto:
    <rbn:RibbonCommand x:Key="UlozitCommand"
     CanExecute="UlozitCommand_CanExecute"
     Executed="UlozitCommand_Executed"
     LabelTitle="Uložit"
     LargeImageSource="Images\Save.png"
     SmallImageSource="Images\Small\Save.png"
     ToolTipTitle="Uložit dokument"
     ToolTipDescription="Uloží aktuální dokument." />
    
    V kódu by pak měly být tyto položky:
    private bool mblnUlozeno;
    
    private void UlozitCommand_CanExecute(object target, CanExecuteRoutedEventArgs args) {
       args.CanExecute = !mblnUlozeno;
      }
    
    private void UlozitCommand_Executed(object target, CanExecuteRoutedEventArgs args) {
      if(!mblnUlozeno)
         mdcDokument.Ulozit();
       mblnUlozeno = true;
      }
    
    //ještě je potřeba doplnit kód, který reaguje na změny dokumentu a nastavuje hodnotu mblnUlozeno na false



    Boris Lehečka (Word, VBA, XML, C#, SQL)
    13. prosince 2009 22:14
  • Děkuji. vyzkouším.

    Funguje to. Ani jsem netušil jak je to snadné. Někdy stačí jen trochu nakopnout. Díky
    14. prosince 2009 21:18