Laden...

Event-Weitergabe blokieren?

Erstellt von el_vital vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.873 Views
E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 11 Jahren
Event-Weitergabe blokieren?

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?

5.742 Beiträge seit 2007
vor 11 Jahren

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

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 11 Jahren

Ich habe auch schon probiert auszublenden:


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

Sobald ich es einblende werden die Events genau so aufgerufen.

5.742 Beiträge seit 2007
vor 11 Jahren

Was willst du jetzt eigentlich genau erreichen?
Dass die Events vom Grid abgefangen werden oder nicht?

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 11 Jahren

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.

5.742 Beiträge seit 2007
vor 11 Jahren

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

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 11 Jahren

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.

5.742 Beiträge seit 2007
vor 11 Jahren

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).

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.

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 11 Jahren

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;
    }
}


U
1.688 Beiträge seit 2007
vor 11 Jahren

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.

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 11 Jahren

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.