Mein benutzerdefiniertes Ereignis args: < /p>
Code: Select all
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>
In meinem UserControl versuche ich es als folgenden zu verwenden: < /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>
Und das einfache xaml: < /p>
< /code>
In meinem Fenster möchte ich den boardclickedEvent < /p>
verwenden
< /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
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?