Как создать пользовательские mousebuttoneventargs в WPF?C#

Место общения программистов C#
Ответить
Anonymous
 Как создать пользовательские mousebuttoneventargs в WPF?

Сообщение Anonymous »

Мне нужно передавать дополнительные данные в событии WPF Mouse, поэтому я пытаюсь создать свое собственное событие Args, унаследовавшись MousebuttoneventArgs. Какой правильный способ подкласс? Я не могу заставить это работать так, как хочу. Вот мой обходной путь: < /p>
Мое пользовательское событие args: < /p>

Код: Выделить всё

public class BoardClickedEventArgs : MouseButtonEventArgs
{
public int Row { get; }
public int Col { get; }

// Constructor calls base constructor
public BoardClickedEventArgs(MouseDevice mouse, int timestamp, MouseButton button, int row, int col)
: base(mouse, timestamp, button)
{
Row = row;
Col = col;
}
}
< /code>
В моем usercontrol я пытаюсь использовать его следующим образом: < /p>
    public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
public static readonly RoutedEvent BoardClickedEvent = EventManager.RegisterRoutedEvent(
nameof(Board_Clicked),
RoutingStrategy.Tunnel,
typeof(MouseButtonEventHandler),
//typeof(BoardClickedEventHandler), //not working
typeof(UserControl1));

// CLR event wrapper
public event MouseButtonEventHandler Board_Clicked
{
add { AddHandler(BoardClickedEvent, value); }
remove { RemoveHandler(BoardClickedEvent, value); }
}

protected void RaiseBoardClicked(MouseButtonEventArgs e, int row, int col)
{
BoardClickedEventArgs args = new BoardClickedEventArgs(e.MouseDevice, e.Timestamp, e.ChangedButton, row, col) { RoutedEvent = BoardCtrl.BoardClickedEvent };
this.RaiseEvent(args);
}

protected override void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e)
{
base.OnMouseDown(e);
Point p = e.GetPosition(boardgrid);
int Row = Convert.ToInt32(p.X/9);
int Col = Convert.ToInt32(p.Y / 9);
RaiseBoardClicked(e,Row, Col);
}
public delegate void BoardClickedEventHandler(object sender, BoardClickedEventArgs e);
}
< /code>
и простой xaml: < /p>





< /code>
В моем окне я хочу использовать Boardclickedevent < /p>





< /code>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void UserControl1_Board_Clicked(object sender, MouseButtonEventArgs e)
{
if (e is BoardClickedEventArgs)
{
BoardClickedEventArgs e2 = (BoardClickedEventArgs)e;
MessageBox.Show($"{e2.Row} and {e2.Col}");
}
}
}
< /code>
What I want is this, without the need to cast the event:
 private void UserControl1_Board_Clicked(object sender, BoardClickedEventArgs e)
< /code>
When I set the type of the EventHandler from MouseButtonEventHandler
до boardclickedeventhandler Я получаю систему. public static readonly RoutedEvent BoardClickedEvent = EventManager.RegisterRoutedEvent(
nameof(Board_Clicked),
RoutingStrategy.Tunnel,
typeof(BoardClickedEventHandler), //not working
typeof(UserControl1));

public event BoardClickedEventHandler Board_Clicked
{
add { AddHandler(BoardClickedEvent, value); }
remove { RemoveHandler(BoardClickedEvent, value); }
}
< /code>
Can somebody explain me why my approach isn't working and whats the proper way to do it, without the need of casting?

Подробнее здесь: https://stackoverflow.com/questions/797 ... rgs-in-wpf
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»