问题标签 [routedevent]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
707 浏览

wpf - 为什么附加到隧道事件的此类处理程序不会在实例处理程序之前触发?

根据这篇 MSDN 文章(除其他外),

每当路由事件到达其路由中的元素实例时,在附加到该类实例的任何实例侦听器处理程序之前调用类处理程序。

我对RoutedEvents 很陌生,所以我的代码中可能有错误,但似乎附加到 a 的类处理程序RoutedEvent被声明为RoutingStrategy.Tunnel并不总是在附加到同一事件的实例处理程序之前触发。

在下面的示例中,我创建了一个TouchButton带有隧道RoutedEvent和冒泡的控件类RoutedEvent。我已经为每个注册了类处理程序。然后,我在窗口中创建了该类的一个实例,并在后面的代码中处理每个事件。Grid我在类元素和包含它的元素上都为隧道事件附加了相同的处理程序。所有四个处理程序都以 a 显示它们的名称,MessageBox因此您可以清楚地看到执行顺序。

  1. 网格实例 PreviewTouch
  2. 类 TouchButton_PreviewTouch
  3. TouchButton 实例 PreviewTouch
  4. 类 TouchButton_Touch
  5. TouchButton 实例触摸

这意味着如果我调用e.Handled = true;PreviewTouch事件处理程序,我可以停止执行到达所有其他事件处理程序,除了附加到Grid元素的事件处理程序。这应该是这样,还是我在某个地方犯了错误?否则,如何阻止执行到达每个实例事件处理程序?

这是课程:

以下是后面窗口代码中的实例处理程序:

这是控制 XAML:

我确实知道隧道事件是Grid在“隧道”到元素之前由元素处理的TouchButton,但我认为类处理程序总是应该在实例处理程序之前触发。如果没有,我怎样才能做到这一点?

更新>>>

感谢@sanguine 的回答,我设法找到了一种方法来阻止所有实例处理程序处理事件。如果不是像 sanguine 建议的那样替换声明的类处理类型,而是将其替换为TouchButton,那么它将捕获所有派生控件。GridFrameworkElementFrameworkElement

0 投票
2 回答
536 浏览

c# - 通过 ContentTemplate 在样式触发器中生成的焦点元素

使用 WPF 我正在尝试生成一个 TextBlock,它在双击后“转换”为准备编辑的 TextBox。之后,Enter 键、Esc 键或失去焦点会导致编辑结束,并且 TextBox 会恢复为 TextBlock。

我找到的解决方案主要是有效的。我的问题是我无法将 TextBox 集中在“转换”上,从而迫使用户再次显式单击元素以使其集中并开始编辑。

代码说明

我选择实现此行为的方式是使用模板和样式的 DataTriggers 来更改元素的模板。在我展示的示例中,该元素是一个简单的 ContentControl,尽管我尝试执行此操作的实际用例稍微复杂一些(我有一个 ListBox,其中每个元素都可以通过此行为进行编辑,一次一个)。

思路如下:

  • ContentControl 具有关联的样式
  • 关联的 Style 将 ContentTemplate 定义为 TextBlock。
  • 模型对象有一个属性 InEditing,当我想编辑控件时它变为 true
  • 通过 TextBlock 上的 MouseBinding,我将模型的 InEditing 属性设置为 True
  • Style 有一个监听 InEditing 的 DataTrigger,在这种情况下将 ContentTemplate 设置为 TextBox
  • 通过 EventSetters,我捕获了 Enter、Esc 和 LostFocus,以便恢复保存更改并恢复到以前的样式。请注意:我不能直接将事件附加到文本框,否则我会得到一个无法在样式中的目标标记上指定的事件。请改用 EventSetter。

虽然不是最佳的(视图和模型行为有一定的混合 - 特别是在 InEditing 属性中 - 我不喜欢通过 KeyDown 和 LostFocus 的各种处理程序从本质上重新实现对 TextBox 模型的更改的提交逻辑),系统实际上可以正常工作。

失败的实现思路

起初我想连接到 TextBox 的 IsVisibleChanged 事件,并将焦点设置在那里。不能这样做,因为前面提到的无法在 Style 中的 Target 标签上指定事件。请改用 EventSetter。

错误提示的解决方案无法使用,因为此类事件不是路由事件,因此无法在 EventSetter 中使用。

编码

代码分为四个文件。

模型.cs:

应用程序.xaml:

MainWindow.xaml:

主窗口.xaml.cs

0 投票
1 回答
1030 浏览

wpf - 奇怪的 KeyUp 行为(主窗体处理来自孩子的事件?!)

问题:

  1. KeyUp 由主窗口中的网格处理 ( Grid_KeyUp)
  2. 主窗口显示一个子窗口(例如MessageBox.Show(...)
  3. 用户按 [Return] ( Keys.Return) 关闭MessageBox
  4. 主窗口实际上从 MessageBox 中的该按键获取 KeyUp 事件

我有一个非常简单的孤立样本,它显示了我遇到的问题。只需创建一个空的 WPF 项目并使用此 XAML:

和代码隐藏:

如果单击按钮并按 [Return] 关闭 MessageBox,输出窗口将打印:

奇怪的事实:

  1. 按 [Escape] 时我得到相同的行为(KEYUP: Escape被打印),但是当我按 [Space] 时,控制台不会打印出任何东西!
  2. e.Source 和 e.OriginalSource 指向主窗口中的按钮(这显然是错误的)。
  3. 如果您MessageBox.Show(...)在事件未由 out KeyUp 处理程序处理后立即放置断点(即输出为空)。

谁能向我解释发生了什么?

PS目标框架是:.NET 4 Client

0 投票
2 回答
255 浏览

c# - Passing data between different views

I am writing a WPF application in C# according to the MVVM model. I have a MainWindow which consists of several views: MenuView, ContentView1, ContentView2, . . . and so on.

The MenuView, ContentView1, ContentView2 . . ., are all cousins (not bothers) in the XAML tree.

The MenuView consists of few buttons. Each button has a unique ID. The Content Views (all of them) should receive the menu ID of a selected (clicked) button. i.e. when a button in the MenuView is clicked I want to pass its ID to ContentsViews1, ContentsViews2 and so on.

I am not sure what is the best way to pass data between the views.

I thought to attach an event handler to all menu buttons which reside in the MenuView. The handler is implemented in MainWindow class (which is the root view). This handler will raise a RoutedEvent (with tunnel option) to all children views.

Is there a better way to do it? Is it the best way considering performance issue?

0 投票
1 回答
2660 浏览

c# - 未找到 UserControl 中的自定义 RoutedEvent

我在使用 XAML 设计器时遇到了一些问题。

我有一个代表自定义 ProgressBar 的 UserControl:只是一个基于状态的带有一些颜色的旋转圆圈。它扩展了 UserControl,我已将本地命名空间添加到 XAML 文件并将其命名为“本地”。

在代码隐藏中,我创建了一个自定义事件,如下所示:

在我的 XAML 文件中,我有一个 EventTrigger 来连接一些动画:

然而,这给了我一个错误:在“UserControl”类型中找不到事件“NotStartedEvent”。

我在网上搜索过,但找不到我做错了什么,这一定是一些愚蠢的细节。例如是因为 EventTrigger 在 UserControl.Triggers 下吗?

我已经尝试过多次清理和重建项目,并且效果很好。只有 XAML 设计器给了我这个错误。

0 投票
1 回答
641 浏览

wpf - 我在哪里可以找到 CommandTarget?

我仍在使用 Commands 和 RoutedEvents 进行体验。在不使用 RoutedCommands 的情况下,我尝试实现一个非常简单的程序。

这是我的命令类:

为了确保我对该命令具有静态访问权限,我创建了一个静态类来保存所有命令:

这是您将在我的 MainWindow.xaml 中找到的内容:

我想要的是通过单击menue1-item 'mainTextBox'的背景发生变化。那么让我们看看我的 MainWindow.cs 内部:

该程序正在工作 - 但不正确:) 它总是改变 MainWindow 的背景,但不是我的 CommandTarget。

那么 - 我做错了什么?我是不是忘记了什么?

0 投票
1 回答
1517 浏览

wpf - 如何实现 wpf 键绑定

我希望能够允许用户在运行时更改热键。

有没有人有一个具体的例子来说明如何在代码隐藏 C# 中绑定一个键来完成这个?

我假设我必须使用 RoutedCommand 进行键绑定。假设我想用热键按下 UI 上的按钮。

例如... 让用户按 F5 以单击应用程序上的 btnGo。

0 投票
2 回答
6460 浏览

wpf - WPF 按钮 EventTrigger=Button.IsEnabledChanged

我想以两种方式动画按钮的颜色变化(基于其 IsEnabled 属性):1)当它从启用更改为禁用时 - >颜色将从白色变为黑色。2) 当它从禁用变为启用时 -> 颜色将从黑色变为白色。

我正在尝试将EventTriggerRoutedEvent一起使用,但只有一个名为 Button 的事件。已启用更改

我有一个按钮,它的 IsEnabled 属性根据逻辑状态进行更改。状态机正在工作,但我想在按钮启用或禁用时更改按钮的颜色(使用 ColorAnimation)。

最好的方法是什么?

0 投票
1 回答
62 浏览

c# - 谁处理了我的活动

我已经在 TextBox 上注册了一个 LostFocus 事件,但该事件没有被捕获 - 我的猜测是其他人处理了它。我试过使用 snoop,但它只显示 MouseDown 和 MouseUp 事件(我需要 LostFocus)。关于如何找出答案的任何想法?

谢谢

更新:不太清楚,但我注册的代码是:

eventInfo.AddEventHandler(cloningObject, eventDelegate);

0 投票
6 回答
1886 浏览

wpf - WPF View-ViewModel 松耦合通信

使用 WPF,我的团队正在尝试使用 MVVM 设计模式分离设计和代码。为了实现这一点,我们正在慢慢远离 UserControl 方法,因为它在设计和代码之间存在大量耦合。我们一直在研究结合 ViewModel 类使用控制模板、样式和数据模板。迄今为止,我们已经完成了大量此类工作。

我们遇到的问题与 View 和 ViewModel 之间的通信/通知有关。目前,我们已经“解决”了使用 ICommand 的 View -> Viewmodel 通信问题。即,我们创建一个按钮并将其“Command”参数绑定到 ViewModel 中定义的 RelayCommand 的名称。通过这样做,从 View 引发的按钮单击或其他 Command 事件会调用 ViewModel 中定义的函数。这行得通。

我们遇到的主要问题是让通知以相反的方式运行:即 ViewModel 中的数据更改需要触发 View 中的更新。我们使用 NotifyPropertyChanged 和 DataTriggers 执行此操作,但这并不能满足我们的需求。我们需要的是能够在 Viewmodel 中引发某种事件并让 View 订阅所述事件。我们一直在寻找这个问题的答案,并发现了 RoutedEvents 和 AttachedBehaviors。RoutedEvents 似乎是解决方案的赢家,但是根据我们的研究,RoutedEvents 无法注册到不从 UIElement 扩展的 ViewModel 上,我们特别尝试将代码与设计分开。

最终,我们要做的是设置一个 ViewModel,可以在其中设置参数或调用函数,从而在 View 上引发事件或行为,然后运行动画。我们确实使用 DataTriggers 进行了这项工作,但是我们试图将我们的动画分离到 ControlTemplate 中,这会引发问题,因为包含 DataTriggers 的 DataTemplate 无法访问 ControlTemplate 中定义的 Storyboard。

有人可以指出我们正确的方向吗?特别是在 ViewModel 中引发事件(不需要扩展 UIElement)并在 View 中订阅此事件并激活 Storyboard。

谢谢