C#从控件中删除自定义鼠标单击事件处理程序

时间:2014-06-04 21:56:37

标签: c# events

我正在尝试添加然后将自定义MouseClick事件处理程序移除到某些按钮。窗口上的控件正在运行时构建。我可以根据另一个回答的问题添加我的自定义处理程序     localBtn.MouseClick += new MouseEventHandler((se, e) => Move_MouseClick(se, e, center, type));

我阅读了有关删除EventHandlers的其他问题,但它们似乎适用于“标准”事件处理程序。我终于得到了这个来编译 object se=null; MouseEventArgs e=null; localBtn.MouseClick -= new MouseEventHandler((se1, e1) => Move_MouseClick( se, e, center, type));(其中中心和类型在参数中传递。) 我不知道这是否有效......因为我今天已经没时间了......

我正在创建一个按钮的网格(8x4)(将来可能更大),当点击一个按钮时,周围的按钮会“更改”为动作按钮。想想井字游戏,点击中心按钮,其他所有按钮变为“活跃”。自定义处理程序是通过引用“中心”按钮创建的,然后是一个枚举,指示然后处理程序的8个按钮中的哪一个,top,left,right,topLeft,BottomRight等。 一旦按下“活动”按钮之一“发生了某些事情”并且需要移除处理程序并且按钮将恢复到“非活动”状态。这些按钮来自一个对象,该对象具有对其周围所有其他“按钮”的“引用”。

我看了How to remove all event handlers from a controlC# removing an event handlerr

也许更好的控制更适合我正在做的事情?

[编辑]我已经尝试了 - =如上所示但是没有用。控件仍然附加了两个事件处理程序。无论如何,该程序没有失败,所以我不确定 - =做了什么?我什么都没想。

2 个答案:

答案 0 :(得分:2)

听起来你应该使用用户控件来完成你想要完成的任务。下面是一个如何在后面的代码中完成它的例子(对于你正在做的事情可能有一个更好的方法;这只是为了给你一个工作的例子):

ButtonGrid.xaml:

<UserControl x:Class="WpfApplication1.ButtonGrid"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid x:Name="PART_Grid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
    </Grid>
</UserControl>

ButtonGrid.cs(也可以在这里制作网格,因为其他所有内容都在这里完成):

public partial class ButtonGrid : UserControl
    {
        private int rows, cols;
        private Button[] buttons;
        public ButtonGrid()
        {
            InitializeComponent();

            cols = 4;
            rows = 8;
            buttons = new Button[cols * rows];
            Button button;
            for (int i = 0; i < cols; i++)
            {
                for (int j = 0; j < rows; j++)
                {
                    // Make the button, set its place on the grid, set the necessary properties, give it OnClick, then add it to the grid
                    button = new Button();
                    button.SetValue(Grid.ColumnProperty, i);
                    button.SetValue(Grid.RowProperty, j);

                    button.Name = "Button" + (j + (rows * (i))).ToString();
                    button.Content = j + (rows * (i));
                    button.IsEnabled = false;

                    button.Click += OnClick;

                    buttons[j + (rows * (i))] = button;
                    PART_Grid.Children.Add(button);
                }
            }
            buttons[12].IsEnabled = true;
        }

        private void OnClick(object sender, RoutedEventArgs e)
        {
            int index;
            Button button = sender as Button;
            // Determine which button was pressed by finding the index of the button that called this from the button name
            if (button.Name.Length == 7)
            {
                index = Int32.Parse(button.Name.Substring(6, 1));
            }
            else
            {
                index = Int32.Parse(button.Name.Substring(6, 2));
            }

            // Make sure the buttons that are being affected are within bounds
            if ((index - 1) >= 0)
            {
                buttons[index - 1].IsEnabled = true;
            }

            if ((index - rows) >= 0)
            {
                buttons[index - rows].IsEnabled = true;
            }

            if ((index + 1) <= (cols * rows - 1))
            {
                buttons[index + 1].IsEnabled = true;
            }

            if ((index + rows) <= (cols * rows - 1))
            {
                buttons[index + rows].IsEnabled = true;
            }
        }
    }

我只是将其放在主窗口中<local:ButtonGrid Width="500" Height="500" />

enter code here

按下时:

enter image description here

你可以继续点击按钮,看看周围的按钮是如何启用的(或者你想要发生在他们身上的任何事情)。

答案 1 :(得分:0)

您可以在鼠标点击事件中创建另一个空白并将按钮的点击分配给该空按钮,

但这次不使用+ =,只需使用=