2012-05-23 3 views
0

следующий код должен был превратить все кнопки, присутствующие в форме, в зеленый цвет на одном из щелчков кнопки из-за пузырьков событий, но на моей машине на Visual studio 2008 это поворачивая только кнопку нажатой как зеленый, не могли бы вы помочь в решении проблемы?Нужна помощь в понимании кода пузырьков событий в WPF

XAML кода (Window1.xaml):

<Window x:Class="EventRouting.Window1" Title="Event Routing" Height="300" Width="300" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Border Margin="15" BorderBrush="Blue" BorderThickness="5" Padding="15" 
      CornerRadius="12" x:Name="myBorder" Background="Transparent"> 
<StackPanel x:Name="myPanel" Background="Transparent"> 
    <Ellipse x:Name="myEllipse" Margin="3" Fill="Green" Height="40" /> 
    <Rectangle x:Name="myRectangle" Margin="3" Fill="Cyan" Height="40" RadiusX="10" RadiusY="10" /> 
</StackPanel> 

CS код (window1.xaml.cs)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Diagnostics; 

namespace EventRouting 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      this.MouseEnter += MouseEnterHandler; 
     myBorder.MouseEnter += MouseEnterHandler; 
     myPanel.MouseEnter += MouseEnterHandler; 
     myEllipse.MouseEnter += MouseEnterHandler; 
     myRectangle.MouseEnter += MouseEnterHandler; 

     this.MouseDown += MouseDownHandler; 
     myBorder.MouseDown += MouseDownHandler; 
     myPanel.MouseDown += MouseDownHandler; 
     myEllipse.MouseDown += MouseDownHandler; 
     myRectangle.MouseDown += MouseDownHandler; 

     for (int i = 1; i <= 5; ++i) 
     { 
      Button btn = new Button(); 
      btn.Content = "Button " + i; 
      myPanel.Children.Add(btn); 

      //btn.Click += new RoutedEventHandler(btn_Click); 
     } 

     myPanel.AddHandler(Button.ClickEvent, new RoutedEventHandler(btn_Click)); 
    } 

    void btn_Click(object sender, RoutedEventArgs e) 
    { 
     Button btn = (Button) e.Source; 
     btn.Background = Brushes.Green; 
    } 

    void MouseEnterHandler(object sender, MouseEventArgs e) 
    { 
     Debug.WriteLine("MouseEnter: " + sender); 
    } 
    void MouseDownHandler(object sender, MouseButtonEventArgs e) 
    { 
     Debug.WriteLine("MouseDown: " + sender); 
     e.Handled = true; 
    } 

} 
} 

ответ

2

Маршрутизированные события закрашивают визуальное дерево, пока не будут обработаны. Используя ваш XAML, попробуйте этот код.

public MainWindow() 
    { 
     InitializeComponent(); 
     myEllipse.AddHandler(UIElement.MouseDownEvent, new RoutedEventHandler(OnMouseDown)); 
     myPanel.AddHandler(UIElement.MouseDownEvent, new RoutedEventHandler(OnMouseDown)); 
     myBorder.AddHandler(UIElement.MouseDownEvent, new RoutedEventHandler(OnMouseDown)); 
    } 

    void OnMouseDown(object sender, RoutedEventArgs e) 
    { 
     UIElement uiElement = sender as UIElement; 
     Debug.WriteLine(uiElement.GetType().ToString()); 
     e.Handled = true; 
    } 

Если вы закомментируете строку e.Handled = true, событие перейдет в родительские элементы. Вот хороший link для вас.

0

Поскольку обработчик события btn_Click (объект отправителя, MouseEventArgs e) отправляет нажатой кнопку, вы не можете использовать только объект отправителя, чтобы изменить текст на зеленый.

Вы должны делать что-то вроде foreach (Button btn in myPanel.Children), где вы прокручиваете все свои кнопки и меняете цвет в своем цикле.

+0

но событие добавляется в myPanel (stackPanel), который сохраняет все кнопки, поэтому он должен применяться ко всем кнопкам? – mohits00691

1

Если я понимаю, что вы хотите, это событие туннеля от корня (панели) к каждому ребенку (кнопки). Маршрутизированные события туннеля этого не делают, они только пересекаются от корня к исходному элементу, а не к братьям и сестрам. См. Overview of routed events in WPF с большой иллюстрацией этого.