Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Event-Weitergabe blokieren?
el_vital
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

Event-Weitergabe blokieren?

beantworten | zitieren | melden

Es geht um eine WinRT Anwendung, aber das Verhalten ist bei WPF und Silverlight gleich.

Ich habe ein Image mit einem Click-Event. Dadrüber wird ein Grid eingeblendet.
Wenn auf dem Grid genau auf der Position des Images geklickt wird, dann wird das Click.Event an das Image weiter gereicht, wenn das Grid ausgeblendet wird.
Das ist wirklich seltsam. Ich müßte die Weitergabe des Events blockieren.

Hat jemand eine Idee wie das geht?
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat von el_vital
dann wird das Click.Event an das Image weiter gereicht, wenn das Grid ausgeblendet wird.
Das ist wirklich seltsam.
Ne - das ist nicht seltsam ;-)
Ausgeblendete bzw. unsichtbare Control(-Teile) erhalten nie Mausevents.

Transparente Controls hingegen schon (mache also als Lösung das Grid mur transparent); siehe {x:Null} vs. Transparent
private Nachricht | Beiträge des Benutzers
el_vital
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

beantworten | zitieren | melden

Ich habe auch schon probiert auszublenden:


gridControlls.Visibility = Windows.UI.Xaml.Visibility.Collapsed;

Sobald ich es einblende werden die Events genau so aufgerufen.
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

Was willst du jetzt eigentlich genau erreichen?
Dass die Events vom Grid abgefangen werden oder nicht?
private Nachricht | Beiträge des Benutzers
el_vital
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

beantworten | zitieren | melden

Ich möchte, dass die Events nicht an das Image unter dem Grid geleitet werden, nachdem es wieder sichtbar ist.
Es scheinen sich die Events in einer Queue zu sammeln und wenn das Image wieder sichtbar ist, werden die ausgelöst.
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat von el_vital
Ich möchte, dass die Events nicht an das Image unter dem Grid geleitet werden, nachdem es wieder sichtbar ist.
Das hab' ich jetzt nicht genau verstanden: Du hast also ein Grid, dass (wie du es willst), Events eines darunterliegenden Images quasi "abfängt". Dann blendest du es aus, die Events landen (ebenso korrekterweise) beim Image.
Und dann blendest du das Grid wieder ein und die Events landen immer noch beim Image.

Richtig soweit?

Am besten postest du mal ein wenig Code; idealerweise in der Form von [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden
private Nachricht | Beiträge des Benutzers
el_vital
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

beantworten | zitieren | melden

Nicht ganz richtig. Image wird von einem Grid verdeckt, auf das Grid wird an der Position des Image geklickt, es passiert in dem Moment nichts (ist so gewollt). Jetzt wird das Grid ausgeblendet und in dem Augenblick wird das Click-Event gefeuert. Wie bereits geschrieben finde ich dieses Verhalten seltsam.

Ich glaube es hat doch nur etwas mit WinRT und Asynchronität zu tun. Normal dürfte so etwas nicht passieren.
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat von el_vital
Jetzt wird das Grid ausgeblendet
Wann genau? Bzw. aufgrund von welchem Ereignis?
Evtl. ist der Klick einfach noch nicht abgearbeitet; blende das Grid testweise mal mit einem Dispatcher.BeginInvoke aus, dem du eine sehr niedrige Priorität übergibst (Idle oder so ähnlich).
Zitat von el_vital
Ich glaube es hat doch nur etwas mit WinRT und Asynchronität zu tun. Normal dürfte so etwas nicht passieren.
Wie gesagt: Wenn du es mit wenig Code reproduziert kriegst, wäre das ganz hilfreich.
private Nachricht | Beiträge des Benutzers
el_vital
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

beantworten | zitieren | melden

Hallo winSharp93. Vielen Dank für deine Tipps.
Hiermit funktioniert es:



private async void HideGridPleaseWait()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
     gridPeaseWait.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
              
    });
}

private  voidgridPeaseWait_LayoutUpdated(objectsender, objecte)
{
    if(gridPeaseWait.Visibility == Windows.UI.Xaml.Visibility.Collapsed)
    {
            myImage.IsHitTestVisible = true;
    }
    else
    {
            myImage.IsHitTestVisible = false;
    }
}

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von el_vital am .
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Hallo,

Du hattest also das Grid innerhalb eines Click-Events "ausgeblendet". Beim Loslassen der Maustaste (MouseUp) löst das Click-Event des Images aus.
Dann hätte es wahrscheinlich auch funktioniert, wenn Du das Grid bei MouseUp "ausgeblendet" hättest.
private Nachricht | Beiträge des Benutzers
el_vital
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

beantworten | zitieren | melden

Nein, ich habe es nicht in einem Click-Event ausgeblendet.
Mit einem Click-event habe ich eine asynchrone Funktion zum Öffnen eines Bildes von der Festplatte gestartet. Am Ende dieser Funktion habe ich über eine Flag-Variable in einem zyklischen Timer die Funktion HideGridPleaseWait() aufgerufen.
private Nachricht | Beiträge des Benutzers