2013-09-04 25 views
10

Köpürme ve tünellemenin nasıl çalıştığını anlıyorum. Ancak, bunları kullanmak konusunda kafam karıştı. İşte nedeni:Tünel açma ve köpürme olayları WPF'de ne zaman yararlı olur?

Bir fare tıklatması olayını işlemek istiyorum. Kabarmak için, MouseDown var ve tünel için PreviewMouseDown var. Ancak, MouseDown, kullanıcının denetimi tıkladığı anlamına gelmez. Kullanıcı düğmeye basabilir ve tıklamayı iptal etmek için bundan uzaklaştırabilir. Düğmeye tıklanmadığında hiçbir şeyi değiştirmek istemem.

Benim sorum şu: Kabarcık/Tünel oluşturma stratejileri nasıl faydalı?

cevap

8

. Yönlendirilen etkinlikler, Kabarcık, Tünel veya Doğrudan Yönlendirme Trendini destekler.

private void Grid_Click(object sender, RoutedEventArgs e) 
{ 
    MessageBox.Show("Button Test clicked!"); 
} 

RoutedEventArgs Orada belirtilen, bu nedenle olay nakledilmektedir: en Button.Click olay işleyicisi bir göz atalım. önizlemesi adında bu nedenle bu Bubble olayı belirtilmemiş. Eğer TestButton tıkladığınızda

<Grid ButtonBase.Click="Grid_Click"> 
    <Button Name="TestButton" Width="100" Height="30" Content="Test" /> 
</Grid> 

, olay Grid üstesinden gelmektir ve bir ileti görüntüler: Bu aşağıdaki şekilde ortaya konabilir

Düğme Testi tıklandığında! Standart kontrollerin çoğu Tunneling

Usefulness of Bubbling/Tunneling strategies

, olaylar dinlemek böyle Örneğin vb KeyDown, MouseDown gibi - DataGrid kontrol. Enter tuşuna basarak, fonksiyonun bir kayıt eklenmesi olarak adlandırılmasını istiyorum. Ancak DataGrid zaten KeyDown etkinliğine sahip, bu nedenle olay yükseltilmedi. Yani mantığınızı Tünel etkinliğinde yapmak zorundasınız - PreviewKeyDown, KeyDown olayından önce çalışır. Aynı şey RichTextBoxControl için geçerlidir. Bubbling

Bazen, belirli bir etkinlik için global işleyici gerekir ki, bu VisualTree tüm denetimler için çalıştı. Doğal olarak, doğrudan bir etkinlik bunu yapamazsınız. Bu nedenle sahnede Bubbling olayı geliyor. Bir başka sebep de WPF'nin ideolojisidir. Image, başka Button, vs:

enter image description here

kullanıcı Button yılında TextBlock/Image tıklayabilirsiniz Bu Button şeyi içerebilir. Tıklamanın Button'da olduğunu nasıl anlarız? Bu, Bubbling etkinliğinin yardımıyla.

fazla bilgi için lütfen bkz:

: Button üzerine tıklama

private void Grid_Click(object sender, RoutedEventArgs e) 
{ 
    String message = "#" + eventCounter.ToString() + ":\r\n" + 
      " Sender: " + sender.ToString() + ":\r\n" + 
      " Source: " + e.Source + ":\r\n" + 
      " Original Source: " + e.OriginalSource; 

    lstEvents.Items.Add(message); 
} 

Sonucu: Ben Click işleyicisi biraz değişti

Understanding Routed Events and Commands In WPF

enter image description here

+0

Ancak, bildiğim kadarıyla Tıklama, Bubbling olayı yerine doğrudan bir etkinliktir. – SanSolo

+1

@SanSolo: Doğrudan ise, 'Button Test tıklandı!' Mesajı görünmedi. 'Şebeke' değil 'Izgara' için bir işleyici ayarladık ve 'Düğme' için bir tıklama, 'Izgara' için çalışılan olay. “Düğme” deki olay yukarı doğru ilerledi ve “Grid” e geldi. Doğrudan tıklama olayı bildiğim kadarıyla, * 'WinForms' * içinde. –

+1

@SanSolo: Lütfen düzenlememe bakın. –

1

Köpürme/tünelleme kavramını bildiğinizi söylediniz. Ancak, bu olayların amacı, Fare düğmesinin Kontrol veya alt öğelerinde Yukarı veya Üstte olduğunu bilmenizi sağlamasıdır. Senaryonuz için butonunuzdaki Click olayını kullanmalısınız. Fare düğmenin üzerinde ve aşağıdaydı.

Teşekkür

+0

Tıklayın doğrudan olay olacağı. Benim karışıklık kabarcıklanma/tünel olayları kullanımı ile ilgilidir. – SanSolo

3

Merhaba size bazı iyi makaleleri net bu regading ama hala bu cevap vermeye çalışacağız alabilirsiniz bile. Metin ve dikdörtgen:

bir düğmeye tek Dikdörtgen oluşan çok sade bir görünüm verir varsayalım ve dahi böyle temel görsellerle içerik olarak metnin basit bir parçası sağlamak, mevcut iki unsur hala vardır. Düğme, farenin metnin veya dikdörtgenin üzerinde olup olmadığına fare tıklamasıyla yanıt vermelidir. Standart .NET olay işleme modelinde, bu her iki öğe için bir MouseLeftButtonUp olay işleyicisinin kaydedilmesi anlamına gelir. WPF'ın içeriği modelinden yararlanmak çekerken

Bu sorun çok daha kötü olacaktı. Bir Düğme, başlık olarak düz metne sahip olmakla sınırlı değildir; içerik olarak herhangi bir nesnesini içerebilir. Aşağıdaki xaml özellikle iddialı değil, ama bile bunun altı tane görünür unsuru vardır: sarı anahatlı daire, gözler için iki nokta, ağız için eğrisi, metin ve düğme arka planı. Takma olayı Her bir öğe için işleyicileri yorucu ve verimsiz olur. MouseDown'ı çalıştırmak için Bu kod parçasına 8 MouseDownEvents eklemeliydik.

<Button PreviewMouseDown="PreviewMouseDownButton" MouseDown="MouseDownButton"> 
     <Grid PreviewMouseDown="PreviewMouseDownGrid" MouseDown="MouseDownGrid"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <Canvas PreviewMouseDown="PreviewMouseDownCanvas" MouseDown="MouseDownCanvas" Width="20" Height="18" VerticalAlignment="Center"> 
       <Ellipse PreviewMouseDown="PreviewMouseDownEllipse" MouseDown="MouseDownEllipse" x:Name="myEllipse" Canvas.Left="1" Canvas.Top="1" Width="16" Height="16" Fill="Yellow" Stroke="Black" /> 
       <Ellipse Canvas.Left="4.5" Canvas.Top="5" Width="2.5" MouseDown="MouseDownEllipse" Height="3" Fill="Black" /> 
       <Ellipse Canvas.Left="11" Canvas.Top="5" Width="2.5" MouseDown="MouseDownEllipse" Height="3" Fill="Black" /> 
       <Path Data="M 5,10 A 3,3 0 0 0 13,10" Stroke="Black" MouseDown="Path_MouseDown_1"/> 
      </Canvas> 
      <TextBlock Grid.Column="1" MouseDown="TextBlock_MouseDown_1">Click!</TextBlock> 
     </Grid> 
    </Button> 

WPF yerine normal olaylar daha kapsamlı olanKabarcık/Tünel/Normal RoutedEvents kullanır. WPF, olayı ortaya çıkaran öğeye yalnızca işleyicileri ekleyen yerine, kullanıcı arabiriminin kullanıcı arabirimi öğelerinin yürürlüğe girmesini sağlar; bu, 'a eklenen yönlendirilen olay için tüm işleyicileri, kullanıcı arabiriminin köküne kadar kaynak öğeden herhangi bir düğüme çağırır. ağacı. Olay RoutedEventArgs, o zaman nakledilmektedir olayı listede yer alıyorsa

+0

Bu cevap benim sorumun başlığı olan Köpürme/Tünelcilik ihtiyacını açıklar.Bununla birlikte, MouseUp veya MouseDown'ı neden kullanabileceğimiz konusunda karışıklık duyuyorum, çünkü Tıklama gibi bir sonuç değil. MousewheelUp/Down, kullanışlı olduğu senaryoları görebiliyorum.Ama MouseUp durumunda, bir şeyi değiştiriyoruz, kullanıcı düğmeden uzaklaşıyor, tık yok ... nerede kullanırız? – SanSolo

İlgili konular