Diskuze: Vyvolání element over

C# .NET .NET (C# a Visual Basic) Vyvolání element over American English version English version

Avatar
vodslon
Člen
Avatar
vodslon:

Ahoj,

Zatím si to zkouším obecně, ale mám canvas v něm dva Rectangly, které se hejbou bud samy nebo pomocí klávesnice nebo myši. Moje představa je, udělat událost něco jako mouseover s tím rozdílem, že by mi to zachytávalo, že ten Rect1 se dotkne Rect2(nebo obráceně), prostě když najedu jedným čtverečkem do druhého, tak se vyvolá event. Příjde mi to jednoduché, ale asi špatně googluji a z hlavy nemám zkušenosti. Poradil by prosím někdo?

 
Odpovědět 5.8.2014 7:59
Avatar
Odpovídá na vodslon
Michal Žůrek (misaz):

když v kódu posunuješ ty rectangly musíš to ověřit tam, eventy odchytávají uživatelovy akce, ne že nějaký element udělal cosi dalšímu elementu. To si musíš zpracovat sám.

Nahoru Odpovědět  -1 5.8.2014 10:16
Nesnáším {}, proto se jim vyhýbám.
Avatar
vodslon
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
vodslon:

děkuji za odpověd, event přece odchytává i jiné věci, nevím změny, složek, změny v nějáké kolekci atd..já právě to nechci ověřovat tak, že budu porovnávat souřadnice. Když ví program, že kurzor myši se rovná souřadnicích elementu, tak proč by neuměl, že jeden elemement se rovná druhému, ale je pravda, že jsem nic moc na netu nenašel :(

 
Nahoru Odpovědět 5.8.2014 11:22
Avatar
Odpovídá na vodslon
Michal Žůrek (misaz):

však event ti odchytí, všechno co si naprogramuješ, při návrhu WPF toto nikdo nepotřeboval, tak to nikdo v Microsoftu neprogramoval. Ale nikdo ti nebrání.

Nahoru Odpovědět  -1 5.8.2014 11:24
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na vodslon
Michal Štěpánek:

Podle mě by při každém pohybu toho čtverečku měla být zkontrolována pozice i toho druhého čtverečku a podle toho bys měl vyvolávat události...

Nahoru Odpovědět  +1 5.8.2014 11:30
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
vodslon
Člen
Avatar
Odpovídá na Michal Štěpánek
vodslon:

jasně, že tam můžu zkoušet, jeslti se pozice x a zároven y nenachází v jiném objektu, jenže mě to příjde takové divné, když by to ten program měl umět sám, doufal jsem, že jste se s tím někdo setkal a budete umět zachytit pohyb elementů přes sebe...

 
Nahoru Odpovědět 5.8.2014 11:46
Avatar
vodslon
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
vodslon:

ale to je přece, proč to píšu na forum, brání mi to, že to neumím a nemůže se dočíst a ani nevím čeho se chytit, jinak bych Tě přece neotravoval a udělal si to :)

 
Nahoru Odpovědět 5.8.2014 11:47
Avatar
Odpovídá na vodslon
Michal Štěpánek:

...když by to ten program měl umět sám...
Program umí to, co mu přikáže (naprogramuje) programátor. Nikdy jsem podobného nic nedělal, ale myslím si, že jinak, než souřadnicemi objektů se to zjišťovat nedá... Jakým způsobem hýbeš s těmi objekty? Taky v podstatě přes "souřadnice", ne?

Nahoru Odpovědět 5.8.2014 12:57
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na vodslon
Jan Vargovský:
public event EventHandler OnCanvasPositionChange;

public MainWindow()
{
    InitializeComponent();
    Rectangle r = new Rectangle(){ Width=200, Height=200, Fill=Brushes.Red};
    canvas.Children.Add(r);

    OnCanvasPositionChange += MainWindow_OnCanvasPositionChange;

    DependencyPropertyDescriptor
        .FromProperty(Canvas.LeftProperty, typeof(Rectangle))
        .AddValueChanged(r, OnCanvasPositionChange);

    DependencyPropertyDescriptor
        .FromProperty(Canvas.RightProperty, typeof(Rectangle))
        .AddValueChanged(r, OnCanvasPositionChange);

    Canvas.SetLeft(r, 10);
}

void MainWindow_OnCanvasPositionChange(object sender, EventArgs e)
{
    Debug.WriteLine("Rectangle has changed his position!");
}

Kdyžtak si najdi, co jsou to Attached Properties :)

Editováno 5.8.2014 13:13
 
Nahoru Odpovědět 5.8.2014 13:11
Avatar
vodslon
Člen
Avatar
Odpovídá na Jan Vargovský
vodslon:

děkuji za odpověd, todle trochu znám, přiřazuješ event na změnu vlastnosti toho objektu, ale vůbec mi to neřeší to, že já potřebuji vyvolat event při kolizi těch dvou objektů...další možnost co má to udělat v xanu, ale to už se mi zdá zbytečné. Jenom mě překvapuje, že nejde dát prostě tomu elementu stejné vlastnoti, jako má například kurzor myši (i když vím, že takhle napsané je to blbost), ale ten taky neprogramujeme a prostě když máš nad elementem mouseover, project pustíš a najedeš myší nad element tak se vyhodí ten event

 
Nahoru Odpovědět 6.8.2014 7:50
Avatar
Odpovídá na vodslon
Michal Štěpánek:

Zdá se mi, že mícháš věci spolu nesouvisející dohromady. Psal jsem, že program dělá to, co mu "nařídí" programátor. Kursor se chová tak, jak mu "nařídili" autoři operačního systému, takže ano, my kursor neprogramujeme, ale ten kdo vytvořil operační systém, kterého je součástí i funkce kursoru nastavil nějaké chování myši. Je to všechno o tom, co do toho programu naimplementuješ ty jako autor (programátor).

Nahoru Odpovědět  +1 6.8.2014 7:57
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
vodslon
Člen
Avatar
Odpovídá na Michal Štěpánek
vodslon:

Nechci se hádat, ale myslím, že nic nemíchám. Děláme ve vývojovém studiu, kde je už spousty věcí připravených a my je spojujeme. Jedna z těch věcí je i myš a moje otázka zněla, jestli někdo neumíte to, aby si do elementu v canvasu přidala funkce, že když najede na jinej element v canvasu tak vznikne udalost, podobně tak, jako když najede myš...

 
Nahoru Odpovědět  -1 6.8.2014 10:56
Avatar
Odpovídá na vodslon
Michal Štěpánek:

Chápu, čeho bys chtěl docílit, jen jsem psal, že myš ty funkce nemá sama od sebe, ale určil jí je programátor...

Nahoru Odpovědět  +1 6.8.2014 10:57
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na vodslon
Jan Vargovský:
public partial class MainWindow : Window
{
    public event EventHandler OnCanvasPositionChange;
    public event Action OnRectangleColision;

    Rectangle r1, r2;
    public MainWindow()
    {
        InitializeComponent();
        r1 = new Rectangle() { Width = 50, Height = 50, Fill = Brushes.Red };
        r2 = new Rectangle() { Width = 50, Height = 50, Fill = Brushes.Black };
        canvas.Children.Add(r1);
        canvas.Children.Add(r2);

        OnCanvasPositionChange += MainWindow_OnCanvasPositionChange;

        DependencyPropertyDescriptor
            .FromProperty(Canvas.LeftProperty, typeof(Rectangle))
            .AddValueChanged(r1, OnCanvasPositionChange);

        DependencyPropertyDescriptor
            .FromProperty(Canvas.TopProperty, typeof(Rectangle))
            .AddValueChanged(r1, OnCanvasPositionChange);

        Canvas.SetTop(r1, 0);
        Canvas.SetLeft(r1, 0);
        Canvas.SetTop(r2, 100);
        Canvas.SetLeft(r2, 100);
    }

    void MainWindow_OnCanvasPositionChange(object sender, EventArgs e)
    {
        var rect1 = new Rect(Canvas.GetLeft(r1), Canvas.GetTop(r1), r1.Width, r1.Height);
        var rect2 = new Rect(Canvas.GetLeft(r2), Canvas.GetTop(r2), r2.Width, r2.Height);

        if (rect1.IntersectsWith(rect2))
            OnRectangleColision();
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        if (e.Key == Key.Left)
            Canvas.SetLeft(r1, Canvas.GetLeft(r1) - 10);
        else if (e.Key == Key.Right)
            Canvas.SetLeft(r1, Canvas.GetLeft(r1) + 10);
        else if (e.Key == Key.Down)
            Canvas.SetTop(r1, Canvas.GetTop(r1) + 10);
        else if (e.Key == Key.Up)
            Canvas.SetTop(r1, Canvas.GetTop(r1) - 10);
    }
}

Všechno mám za tebe psát já?

Editováno 6.8.2014 14:48
 
Nahoru Odpovědět  +1 6.8.2014 14:46
Avatar
vodslon
Člen
Avatar
Odpovídá na Jan Vargovský
vodslon:

ne doufám, že nemusíš, ale fakt jsem nevěděl, ani třeba o IntersectsWith(), děkuji moc si mi pomohl

 
Nahoru Odpovědět 7.8.2014 8:19
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na vodslon
Jan Vargovský:

Já o ní taky nevěděl, ale google ano :)

 
Nahoru Odpovědět 7.8.2014 15:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.