当我在 Rectangle 上使用 StaticResource 转换器为其背景着色,同时在 DataTemplate 中的另一个组件上使用 MouseDown 处理程序时,我遇到了一个非常奇怪的错误情况。如果我将代码缩小一点,这就是重现错误所需要的:
在顶部我有这些资源,一个指向一个转换器,该转换器从绑定中获取布尔值并将其转换为填充背景颜色):
<Window.Resources>
<vm:DesktopViewModel x:Key="DesktopVM" />
<vm:BooleanToColorConverter x:Key="converter" />
</Window.Resources>
稍后在同一个 xaml 文件中,我使用它迭代了一个警报对象列表(我已经用 StackPanel 替换了网格布局并删除了一些其他组件以缩短代码示例,下面的代码片段仍然失败):
<ItemsControl ItemsSource="{Binding Alarms}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Rectangle Height="20" Stroke="Black" Width="20" RadiusX="4" RadiusY="4" Fill="{Binding Alarm, Converter={StaticResource converter}}"/>
<Image Source="/MyNamespace;component/images/chart.png" Stretch="None" MouseDown="Image_MouseDown" Cursor="Hand"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
如果我删除图像上的 MouseDown 处理程序,它运行得很好,没有开始时出现空指针错误。如果我删除 Rectangle 中的 Fill 标记,则代码与 MouseDown 处理程序一起工作得很好!!!(并且处理程序也可以正常工作)。似乎 Fill 中的 StaticResource 引用搞砸了一些东西,导致定位鼠标处理函数失败?!?
请注意,它在创建窗口时失败,而不是在运行或单击任何内容时。
编辑:如果我将转换器替换为使用带有触发器的 StaticResource 的样式以执行与转换器相同的操作,我会遇到相同的空指针问题。很明显,属性中的 StaticResource 引用是罪魁祸首,但我不知道为什么它会影响事件侦听器。
组件的顺序也无关紧要。如果我将图像放在矩形之前,则错误完全相同。