Tag: routed events

WPF:如何为内容更改创建路由事件?

我有一个框架。 我用这一行切换页面: FrameName.Content = new PageName(); 我希望在页面发生变化时开始使用故事板,我想在XAML中进行,而不是在代码隐藏中。 我试过以下代码: 在搜索了一下后,我意识到没有那种性质的内置路由事件。 这里的第一个答案表明 最动态的方法是简单地派生自己的标签控件,该控件提供ContentChanged事件。 我试图在这个答案中实现代码: using System.Windows; using System.Windows.Controls; namespace ContentChangedTest { class MyFrame : Frame { public event DependencyPropertyChangedEventHandler ContentChanged; static MyFrame() { ContentProperty.OverrideMetadata(typeof(MyFrame), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnContentChanged))); } private static void OnContentChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e) { MyFrame frame = dp as MyFrame; if (frame.ContentChanged != null) { […]

WPF中的自定义附加事件

我可能在这里弄错了术语,但我想我正在尝试创建一个附加事件。 在Surface SDK中,您可以执行以下操作: 我想创建一个自定义事件,可以在XAML中以相同的方式添加处理程序,但我遇到了麻烦。 我可以创建一个自定义路由事件,但XAML intellisense没有看到它,如果我只是定期输入它,则不会添加事件处理程序。 这是我的事件定义: public static class TagRectEvents { public static readonly RoutedEvent TagRectEnterEvent = EventManager.RegisterRoutedEvent( “TagRectEnter”, RoutingStrategy.Bubble, typeof( RoutedEventHandler ), typeof( TagRectEvents ) ); public static void AddTagRectEnterHandler( DependencyObject d, RoutedEventHandler handler ) { UIElement element = d as UIElement; if ( element == null ) { return; } element.AddHandler( TagRectEvents.TagRectEnterEvent, […]

检查RoutedEvent是否有任何处理程序

我有一个自定义Button类,它在点击时总是执行相同的操作(打开一个特定的窗口)。 我正在添加一个可以在按钮的XAML中分配的Click事件,就像常规按钮一样。 单击它时,我想执行Click事件处理程序(如果已分配),否则我想执行默认操作。 问题是,显然没有办法检查是否有任何处理程序添加到事件中。 我认为对事件的空检查会这样做: if (Click == null) { DefaultClickAction(); } else { RaiseEvent(new RoutedEventArgs(ClickEvent, this));; } ……但那不会编译。 编译器告诉我除了+ =或 – =之外我不能对定义类之外的事件执行任何操作,尽管我正在尝试执行此操作检查INSIDE定义类。 我自己实现了正确的行为,但是它很丑陋且冗长,我无法相信没有内置的方法来做到这一点。 我肯定错过了什么。 这是相关的代码: public class MyButtonClass : Control { //… public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent(“Click”, RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonClass)); public event RoutedEventHandler Click { add { ClickHandlerCount++; AddHandler(ClickEvent, value); } remove […]

MouseDoubleClick事件不会冒泡

我的场景,简化:我有一个包含Employees行的ListView,在每个Employee行中,有一些按钮“Increase”和“Decrease”调整他的工资。 假设在我的程序中,双击Employee行意味着“解雇此人”。 问题是,当我快速点击“增加”时,这会触发ListViewItem上的双击事件。 当然,当我只是增加工资时,我不想解雇人。 根据所有其他事件的工作原理,我希望能够通过在事件上设置Handled=true来解决这个问题。 但是,这不起作用。 在我看来,WPF生成两个独立的,完全未链接的双击事件。 以下是重现我的问题的最小示例。 可见组件: 和处理程序代码: private void Button_MouseDoubleClick(object s, MouseButtonEventArgs e) { if (!e.Handled) MessageBox.Show(“Button got unhandled doubleclick.”); e.Handled = true; } private void ListViewItem_MouseDoubleClick(object s, MouseButtonEventArgs e) { if (!e.Handled) MessageBox.Show(“ListViewItem got unhandled doubleclick.”); e.Handled = true; } 启动此程序并双击列出的按钮后, 两个消息框按顺序显示。 (此外,此后按钮会卡在向下位置。) 作为一个“修复”,我可以在ListViewItem处理程序上检查附加到事件的可视树,并检查“那里有一个按钮”,从而丢弃该事件,但这是最后的手段。 我想在编写这样一个kludge之前至少要理解这个问题。 有谁知道为什么 WPF会这样做,以及一种优雅的惯用方法来避免这个问题?

为什么TextBlock不是Routed Event上的OriginalSource?

我正在为ListView元素显示上下文菜单。 上下文菜单附加到ListView的TextBlock ,如下所示。 正确显示上下文菜单,同时也会触发RoutedUIEvent。 问题是在Executed回调中, ExecutedRoutedEventArgs.OriginalSource是ListViewItem而不是TextBlock。 我尝试设置IsHitTestVisible属性以及Background (见下文),因为MSDN说OriginalSource是由命中测试决定的 请注意,我在ListView中使用GridView作为View。 这就是我想要获取TextBlock(获取列索引)的原因 主窗口 MainWindow.xaml.cs using System.Diagnostics; using System.Windows; using System.Windows.Input; namespace WpfApp1 { public class Data { public string Member1 { get; set; } } public partial class MainWindow : Window { public static RoutedCommand Test = new RoutedCommand(); public MainWindow() { InitializeComponent(); CommandBindings.Add(new CommandBinding(Test, (s, e) […]

路由事件和依赖项属性.NET包装器混淆

我是WPF的新手,并且对于路由事件和依赖属性的语法包含了一些困惑,我在许多来源上看到路由事件和依赖属性被包装成这样 // Routed Event public event RoutedEventHandler Click { add { base.AddHandler(ButtonBase.ClickEvent, value); } remove { base.RemoveHandler(ButtonBase.ClickEvent, value); } } // Dependency Property public Thickness Margin { set { SetValue(MarginProperty, value); } get { return (Thickness)GetValue(MarginProperty); } } 我从未在C#中看到添加/删除/设置/获取关键字的类型。 这些是C#语言的一部分作为关键字,我从来没有经历过或使用它们,因为我没有在C#中工作,因为我是一名C ++程序员? 如果不是关键字,那么如果它们不是C#的一部分以及它们如何工作,它们如何被编译器处理

为什么e.Handled = true不起作用?

我有以下XAML 在代码背后,我正在这样做 private void StackPanel_MouseEnter(object sender, MouseEventArgs e) { } private void Grid_MouseEnter(object sender, MouseEventArgs e) { e.Handled = true; } private void Button_MouseEnter(object sender, MouseEventArgs e) { e.Handled = true; } 现在,即使我将鼠标移到Button并设置e.Handled = true ,也会分别调用Grid和StackPanel的事件。 为什么? 我应该怎么做才能阻止路由事件冒泡?