WPF Command vs CommandBindings – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

WPF Command vs CommandBindings – .NET – Fórum – Programujte.comWPF Command vs CommandBindings – .NET – Fórum – Programujte.com

 

Kowalsky950
Stálý člen
1. 5. 2014   #1
-
0
-

Dobrý den,
jednoduchá otázka, jaký je rozdíl když u UIElement-u nastavím Command nebo přidám CommandBinding do CommandBindings?
Command může obsahovat pouze jeden RoutedUICommand, zatímco přes CommandBindings můžu k jednomu objektu přidat více RoutedUICommand. Tedy můžu k jednomu objektu přidat více commandů, což se mi přes attribut Command nepovedlo.
Je zde ještě nějaký rozdíl?
Děkuji za odpověď

Nahlásit jako SPAM
IP: 90.176.114.–
p3can
~ Anonymní uživatel
312 příspěvků
1. 5. 2014   #2
-
0
-

no to je trochu slozitejsi. asi tak: mas button a ten ma property Command. Property command znamene co ten buton bude delat kdyz ho stisknes. podobne jsou nejake dalsi comandy jako treba command u checkboxu. CommandBinding muzes chapat jako kolekci kde mas objekty typu CommandBinding. Tento objekt prijima 3 veci. Comand, CanExecute, Execute.

Comand jako objekt sam o sobe je objekt dedici od ICommand takze ma Execute,CanExecute a event CanExecuteChange. Comand muze byt i tzv. RelayCommand kdy napises

ICommand mujcomand=new RelayCommand(akce,canExecuteAkce);

Command binding naopak pocita stim ze si spis vytvoris prazdne RoutedCommandy (narozdil od implementovanych RelayCommandu) a pomoci CommandBindingu si to napojis.

To znamema ze v pripade CommandBindingu muzes "recyklovat" stejne "jmeno" comandu ale menit mu implementaci, zatimco pokud pouzijes RelayCommand tak to uz ma pevne danou nemenou implementaci.

Snazil sem se snad sem to moc nezamotal xD

Nahlásit jako SPAM
IP: 77.92.213.–
Kowalsky950
Stálý člen
1. 5. 2014   #3
-
0
-

#2 p3can
Ale když mám základ

Button tlacitko=new Button();
RoutedUICommand command=new RoutedUICommand("text","jmeno",typeof(Button));
CommandBinding bind=new CommandBinding(command);
command.Executed = method;

Tak je jedno jestli napíši 

this.CommandBindings.Add(bind);
button.Command=command;
// nebo
button.CommandBindings.Add(bind);

Výsledek bude v obou případech stejný ne? Execute se vyvolá v obou případech. Jedině mě napadá, že u druhého případu můžu specifikovat kdy se má událost vyvolat (přes InputGestures)

Nějak jsem to nepochopil s tou "recyklací" jména commandu.

Ale děkuji za reakci.

Nahlásit jako SPAM
IP: 90.176.114.–
p3can
~ Anonymní uživatel
312 příspěvků
1. 5. 2014   #4
-
0
-

neni.

toto
 

RoutedUICommand command=new RoutedUICommand("text","jmeno",typeof(Button));
command.Executed = method;

neexistuje.

Budto si udelate

RelayCommand command=new RelayCommand(akce,canExecuteAkce);
button.Command=command;

nebo

RoutedUICommand command=new RoutedUICommand();
CommandBinding bind=new CommandBinding(command,akce,canExecuteAkce);
button_nebo_nadrazeny_objekt.CommandBindings.Add(bind);
button.Command=command;

finta v tom je ze mate jeden nazev komandu treba "Cisteni" ale to nema zadnou implementaci KDY a CO ma udelat (pokud je to RoutedUICommand). Az teprve pres commandbinding tomu pridelate CO to ma vlastne delat. Implementace by se mela dedit v ramci WPF stromu. To znamena ze stejny comand muze delat jednu vec v leve casti obrazovky ale v prave casti obrazovky muze tentyz komand delat neco uplne jineho.

Nahlásit jako SPAM
IP: 77.92.213.–
Kowalsky950
Stálý člen
1. 5. 2014   #5
-
0
-

#4 p3can
Jo máš pravdu promiň, Execute event má CommandBinding.

Nicméně můžu udělat tohle:
 

RoutedUICommand command = new RoutedUICommand("text","name",typeof(Button));
command.InputGestures.Clear();
command.InputGestures.Add(new MouseGesture(MouseAction.MiddleClick,ModifierKeys.Alt));
CommandBinding bind = new CommandBinding(command);
bind.Executed += (object o, ExecutedRoutedEventArgs x) => { MessageBox.Show("here"); };
Button tlacitko=new Button();
tlacitko.CommandBindings.Add(bind);

Tedy nespecifikoval jsem přímo CommandProperty na tlačíko, pouze jsem přidal CommandBinding to CommandBindings tlačítka, a metoda napojená na Executed se zavolá.

Nahlásit jako SPAM
IP: 90.176.114.–
Kowalsky950
Stálý člen
1. 5. 2014   #6
-
0
-

Jo a ještě jedna věc, když nastavím CommandProperty na instanci RoutedUICommand, a poté dám this.CommandBindings.Add(bind) tak se Execute zavolá i při obyčejném kliknutí (I když je nastavené RoutedUICommand.InputGestures jak je napsané výše), nevíš čím může být způsobeno tohle?

Nahlásit jako SPAM
IP: 90.176.114.–
p3can
~ Anonymní uživatel
312 příspěvků
2. 5. 2014   #7
-
+1
-
Zajímavé

no takze jinak. ono je to hodne slozite.

mas command to je vetsinou prazdna schranka proste jen jmeno.

pak mas command binding. tam bys mel priradit comandu to co ma delat. ale ZAROVEN na element na ktery umistis tento comandbinding do comandbindings tak od tohoto mista smerem dolu ve WPF stromu se k tomu comandu priradi to co ma delat.

pak mas inputbinding kde prirazujes pri jakych akcich se ma dany comand spustit. take se dedi napric WPF stromem smerem dolu.

solo property command je pro explicitni sdeleni ze po stisknuti daneho tlacitka se ma provest dany command.

skus si tento priklad na pochopeni

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfApplication1="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Grid >
        <Grid HorizontalAlignment="Left" Height="272" Margin="10,10,0,0" VerticalAlignment="Top" Width="213" Background="#FFF79090">
            <Grid.CommandBindings>
                <CommandBinding Command="wpfApplication1:MyComands.MyCommand" Executed="LeftExecute"/>
            </Grid.CommandBindings>
            <Grid HorizontalAlignment="Left" Height="121" Margin="15,118,0,0" VerticalAlignment="Top" Width="171" Background="#FFD160EA">
                <Grid.InputBindings>
                    <MouseBinding Command="wpfApplication1:MyComands.MyCommand"  MouseAction="RightClick"/>
                </Grid.InputBindings>
                <Button Content="Button" HorizontalAlignment="Left" Margin="51,63,0,0" VerticalAlignment="Top" Width="75"/>
            </Grid>
            <Button Command="wpfApplication1:MyComands.MyCommand" Content="Button" HorizontalAlignment="Left" Margin="66,57,0,0" VerticalAlignment="Top" Width="75"/>
        </Grid>
        <Grid HorizontalAlignment="Left" Height="272" Margin="228,10,0,0" VerticalAlignment="Top" Width="260" Background="#FF52EA9E">
            <Grid.CommandBindings>
                <CommandBinding Command="wpfApplication1:MyComands.MyCommand" Executed="RightExecute"/>
            </Grid.CommandBindings>
            <Grid.InputBindings>
                <MouseBinding Command="wpfApplication1:MyComands.MyCommand" Gesture="Control+RightClick"/>
            </Grid.InputBindings>
            <Button Content="Button" HorizontalAlignment="Left" Margin="126,181,0,0" VerticalAlignment="Top" Width="75">
                <Button.InputBindings>
                    <MouseBinding Command="wpfApplication1:MyComands.MyCommand" Gesture="Control+LeftClick" />
                </Button.InputBindings>
                <Button.CommandBindings>
                    <CommandBinding Command="wpfApplication1:MyComands.MyCommand" Executed="RightSpecialExecute"/>
                </Button.CommandBindings>
            </Button>
        </Grid>


    </Grid>
</Window>
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

        }

        private void LeftExecute(object sender, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("LeftEx");
        }

        private void RightExecute(object sender, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("RightEx");
        }

        private void RightSpecialExecute(object sender, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("RighSpecialtEx");
        }
        
      
    }

    public static class MyComands
    {
        private static RoutedUICommand mycom = new RoutedUICommand();
        public static RoutedUICommand MyCommand { get { return mycom; } }
    }
Nahlásit jako SPAM
IP: 77.92.213.–
Kowalsky950
Stálý člen
2. 5. 2014   #8
-
0
-

#7 p3can
Děkuji za reakci. Už to snad chápou, přece jen je tu ale jedna otázka. Pokud přidám do tlacitko.CommandBindings CommandBinding, tak se tyto commandy automaticky vyvolají (pokud je splněna InputGesture podmínka)
Je to defaultní nastavení? Je nějaká možnost, jak to vypnout? Tedy že se bude tento command vyvolavat jen pro vnořene prvky?
Ještě jednou děkuji.

Edit: Existuje ještě nějaký jiný způsob, jak k jednomu objektu přiřadit více commandů?
Vím že jsem asi dotěrný, ale nerad znám jen část :)

Nahlásit jako SPAM
IP: 90.176.114.–
p3can
~ Anonymní uživatel
312 příspěvků
3. 5. 2014   #9
-
0
-

InputGesture je volitelny blok. Muzes pouze nastavit CommandBinding. Nebo si vytvorit pouze RelayCommand ktery ma pevne danou funkčnost. Pokud ho potřebujes nastavit v ramci stromu na vice elementu tak:

a) pouzit v DataTeplate treba v listboxu

b) pouzit ve style napr pro vsechny buttony. pokud v nejakem elementu napr grid nastavym resources-> style ->targettype button-> Command tak vsechny butony obsazene v gridu budou mit nasvaveny tento command

kazdy prvek ma pouze jeden command, nicmene teoreticky je mozne např pomoci inputGesture nastavit vice commandu aby se provedli po akci Click, ale tim podle me pouzivas ty commandy spatne.

Nahlásit jako SPAM
IP: 77.92.213.–
Kowalsky950
Stálý člen
3. 5. 2014   #10
-
0
-

#9 p3can
Právě proto mě to zaráží, protože jeden prvek může mít pouze jeden command. Přitom například TextBox defaultně podporuje více commandů (ApplicationCommands.Copy, ApplicationCommands.Paste,...)
A například tento kod funguje, i když není specifikován command, pouze CommandBindings

Button tlacitko=new Button();

RoutedUICommand prvni = new RoutedUICommand("text","jmeno",typeof(Button));
RoutedUICommand druhy = new RoutedUICommand("text", "jmeno", typeof(Button));
prvni.InputGestures.Clear(); 
druhy.InputGestures.Clear();
prvni.InputGestures.Add(new MouseGesture(MouseAction.MiddleClick,ModifierKeys.Alt));
druhy.InputGestures.Add(new MouseGesture(MouseAction.MiddleClick, ModifierKeys.Shift));
CommandBinding prvniBind = new CommandBinding(prvni);
CommandBinding druhyBind = new CommandBinding(druhy);
prvniBind.Executed += (object o, ExecutedRoutedEventArgs e) => { MessageBox.Show("prvni"); };
druhyBind.Executed += (object o, ExecutedRoutedEventArgs e) => { MessageBox.Show("druhy"); };

tlacitko.CommandBindings.Add(prvniBind);
tlacitko.CommandBindings.Add(druhyBind);

Vyvolá se jak "prvni", tak i "druhy"
Proto se ptám jak je možné k jednomu objektu přidat více commandů. Ne na více elementů jeden command.

Nahlásit jako SPAM
IP: 90.176.114.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 17 hostů

Podobná vlákna

Built-In Command — založil Radek

Command v externím souboru — založil Navara

Command-nefunguje (tkinter) — založil Tom@sQo

Java Command Input — založil Redix

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý