Diskuze: Vyvolání element over
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 16 zpráv z 16.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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
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í.
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...
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...
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
...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?
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
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
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).
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š...
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...
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á?
ne doufám, že nemusíš, ale fakt jsem nevěděl, ani třeba o IntersectsWith(), děkuji moc si mi pomohl
Zobrazeno 16 zpráv z 16.