Wie erstelle ich in WPF einen benutzerdefinierten Mausbuttonventargs?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie erstelle ich in WPF einen benutzerdefinierten Mausbuttonventargs?

Post by Anonymous »

Ich muss zusätzliche Daten in einem WPF -Mausereignis übergeben, also versuche ich, meine eigenen Ereignis -Argumente zu erstellen, die MausbuttoneventArgs erben. Was ist der richtige Weg, um es zu subklassen? Ich kann es nicht zum Laufen bringen, wie ich es will. Hier ist meine Problemumgehung: < /p>
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
to boardclickeDeVentHandler Ich erhalte ein System.invalidcastexception Fehler:
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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post