none
求解,学习WPF中自定义路由事件时没有得到预想的MessageBox对话框。 RRS feed

  • 问题

  • 各位专家:

          本人在学习WPF编程中的自定义路由事件时,编辑完成之后没有程序报错,但是无法显示出预想的MessageBox.Show(),

    自己查不出原因,还请各位专家指点迷津,告知如何改正。

          本人该程序的设计思想:通过路由命令的冒泡模式,在鼠标单击后使其在父控件之一的grid控件上被触发。

    页面的完整XAML代码如下:

    <Window x:Class="WPF_RoutedEvent.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WPF_RoutedEvent"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid local:MyEventClass.MyRoutedE="HowToDo">
            <Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1">
                <StackPanel Background="LightGray" Orientation="Horizontal"  >
                    <Button x:Name="button" Content="Button" Width="75"/>
                </StackPanel>
            </Border>
        </Grid>
    </Window>

    该页面的代码隐藏文件中完整c#如下:

    namespace WPF_RoutedEvent
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            private void HowToDo(object sender, MyEventArg e)//事件的处理方法
            {
                MessageBox.Show(e.Name);
            }
        }

        public class MyEventArg : RoutedEventArgs//事件实参
        {
            public MyEventArg(RoutedEvent re, object source) : base(re, source)
            {

            }
            private string name = "abc";
            public string Name
            {
                set { name = value; }
                get { return name; }
            }
        }

        public class MyEventClass : Button//事件主体
        {
            public static readonly RoutedEvent MyRoutedEEvent =
                EventManager.RegisterRoutedEvent("MyRoutedE", RoutingStrategy.Bubble, typeof(EventHandler<MyEventArg>), typeof(MyEventClass));

            // Provide CLR accessors for the event
            public event RoutedEventHandler MyRoutedE
            {
                add { this.AddHandler(MyRoutedEEvent, value); }
                remove { this.RemoveHandler(MyRoutedEEvent, value); }
            }

            //Raise Event.
            protected override void OnClick()
            {
                base.OnClick();
                MyEventArg myA = new MyEventArg(MyRoutedEEvent,this);
                myA.Name = "www";
                this.RaiseEvent(myA);
            }
        }
    }

    2016年1月26日 14:40

答案

  • 您好 wxysy,

    MyRoutedE这个路由事件是属于MyEventClass控件的,而您的Grid容器内部您放入的是Button而并不是MyEventClass控件。 您需要把Button控件换成MyEventClass控件,MyRoutedE路由事件才会被触发。修改您的代码如下。

    <Grid local:MyEventClass.MyRoutedE="HowToDo">
        <Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1">
            <StackPanel Background="LightGray" Orientation="Horizontal"  >
                <local:MyEventClass x:Name="button" Content="Button" Width="75"/>
            </StackPanel>
        </Border>
    </Grid>


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 wxysy 2016年1月28日 13:43
    2016年1月28日 2:11
    版主

全部回复

  • 您好 wxysy,

    MyRoutedE这个路由事件是属于MyEventClass控件的,而您的Grid容器内部您放入的是Button而并不是MyEventClass控件。 您需要把Button控件换成MyEventClass控件,MyRoutedE路由事件才会被触发。修改您的代码如下。

    <Grid local:MyEventClass.MyRoutedE="HowToDo">
        <Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1">
            <StackPanel Background="LightGray" Orientation="Horizontal"  >
                <local:MyEventClass x:Name="button" Content="Button" Width="75"/>
            </StackPanel>
        </Border>
    </Grid>


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 wxysy 2016年1月28日 13:43
    2016年1月28日 2:11
    版主
  • 您的回答真是一针见血,太棒了!

    谢谢版主!!!

    2016年1月28日 13:44