0

次のコードは、フォーム内に存在するすべてのボタンをボタン クリックの 1 つで、イベント バブリングにより緑色に変更することになっていましたが、Visual Studio 2008 の私のマシンでは、クリックされたボタンのみを緑色に変更しています。問題を理解するのに役立ちますか?

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

}
}
4

3 に答える 3

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 行をコメントアウトすると、イベントは親要素にバブルアップします。ここにあなたのための良いリンクがあります。

于 2012-05-23T16:19:05.310 に答える
1

あなたが望むのは、ルート (パネル) から各子 (ボタン) へのトンネル イベントです。ルーティングされたトンネル イベントはそれを行いません。兄弟ではなく、ルートからソース要素までのみトラバースします。これについては、WPF でのルーティング イベントの概要を参照してください。

于 2012-05-23T16:20:14.220 に答える
0

イベント ハンドラ btn_Click(object sender, MouseEventArgs e) はクリックしたボタンのみを送信するため、sender オブジェクトだけを使用してテキストを緑に変更することはできません。

foreach (Button btn in myPanel.Children)すべてのボタンをループしてループ内の色を変更するようなことをする必要があります。

于 2012-05-23T16:07:14.233 に答える