Ich habe ein Routingereignis als solche deklariert (Namen wurden geändert, die Unschuldigen zu schützen):WPF - Umgang mit benutzerdefinierten auf benutzerdefinierten angebracht Ereignisse steuert
public class DragHelper : DependencyObject {
public static readonly RoutedEvent DragCompleteEvent = EventManager.RegisterRoutedEvent(
"DragComplete",
RoutingStrategy.Bubble,
typeof(DragRoutedEventHandler),
typeof(DragHelper)
);
public static void AddDragCompleteHandler(DependencyObject dependencyObject, DragRoutedEventHandler handler) {
UIElement element = dependencyObject as UIElement;
if (element != null) {
element.AddHandler(DragCompleteEvent, handler);
}
}
public static void RemoveDragCompleteHandler(DependencyObject dependencyObject, DragRoutedEventHandler handler) {
UIElement element = dependencyObject as UIElement;
if (element != null) {
element.RemoveHandler(DragCompleteEvent, handler);
}
}
ziemlicher Standard. In XAML habe ich eine DataTemplate, die ein einzelnes benutzerdefiniertes Steuerelement enthält. Ich versuche, dieses Ereignis zu befestigen (wie auch einige andere angefügten Eigenschaften) an die Steuerung:
<DataTemplate ...>
<My:CustomControl
My:DragHelper.IsDragSource="True"
My:DragHelper.DragComplete="DragCompleteHandler" />
</DataTemplate>
Dies nicht die gewünschten Ergebnisse zu erzielen. Während der Code, der RaiseEvent() für das DragComplete-Ereignis aufruft, aufgerufen wird, wird der Handler nie aufgerufen. Auch sind die Handler für keine anderen benutzerdefinierten Routingereignisse, die an anderer Stelle in dieser XAML-Datei angeschlossen sind.
Ich habe versucht, den Namen des Routingereignisses zu ändern, und ich habe versucht, die Datenvorlage von einem mit einem DataType zu einem mit einem x: Key zu wechseln. Dies führte zu keiner sichtbaren Änderung des Verhaltens.
Wenn ich jedoch My: CustomControl zu einem integrierten WPF-Steuerelement wie einem TextBlock ändern, werden die Ereignisse genau wie ich execute ausgelöst. Wenn ich mein benutzerdefiniertes Steuerelement durch eine andere benutzerdefinierte UserControl-Unterklasse von meinem Projekt ersetze, wird das Verhalten in ähnlicher Weise wieder in den Zustand "gebrochen", "keine Ereignisse, die immer so aussehen, als ob sie behandelt werden".
Das ist nicht sehr sinnvoll für mich. Gibt es etwas Spezifisches, das ich tun muss, damit dieses Szenario funktioniert? Es scheint, dass es nicht wichtig sein sollte. Ich nehme an, es ist möglich, dass es eine bestimmte Sache gibt, die ich in all meinen benutzerdefinierten Steuerelementen gemacht habe, die die Ereignisbehandlung zum Brechen bringt, aber ich habe in den drei oder vier benutzerdefinierten Steuerelementen, die ich bisher ausprobiert habe, nichts Gemeinsames gesehen.
Dank. Mein benutzerdefiniertes Steuerelement wurde von UserControl abgeleitet, aber sogar das Umschalten auf TextBox wie Ihres, weist immer noch das Problem für mich auf. Ich habe den Rest des Codes weggelassen, weil es im Grunde genommen dasselbe ist wie Ihres, abgesehen von einigen Namensraumänderungen. Es ist jedoch Teil eines viel größeren Projekts, daher könnte es eine Art Interaktion mit einem globalen Stil oder einer Ressource geben oder etwas, von dem ich nicht weiß, dass es das Problem beeinflussen könnte. Ich sehe was ich tun kann. –
In Ordnung, also habe ich mit ein bisschen getäuscht. Ausgehend von Ihrem vollständigen Beispiel, das für mich funktionierte, habe ich verschiedene Dinge ausprobiert, um es in den nicht funktionalen Fall zu verwandeln, den ich in meinem größeren Projekt sehe. Nach einer Weile stolperte ich über eine sehr einfache Änderung an Ihrem Basiscode, der das Problem reproduziert. Wenn ich Ihre DragHelper-Implementierung nehme und sie in eine andere Assembly verschiebe, auf die von der Hauptanwendung verwiesen wird, und Window1.xaml entsprechend modifiziere (füge ein xmlns: other und user other hinzu: statt local :) dann sehe ich das Nachrichtenfeld nicht mehr wenn ich das Textfeld eintippe. : | –