FixedPage在我鼠标过快时会导致ArgumentNullException



我遇到这样一种情况:WPF在我的一个视图上成功创建了一个Image元素,但似乎需要一两秒钟才能正确设置该元素的逻辑父元素。如果我在该时间窗口中鼠标悬停,我的应用程序将由于LogicalTreeHelper中的ArgumentNullException而崩溃。

如果我等一秒钟左右,一切都很好,没有问题。但我很难要求我的用户这么做。

请注意,只有当我的UserControl位于DocumentViewer显示的FixedDocument中的FixedPage中时,才会发生这种情况。当我在其他上下文中使用相同的控件时(远离FixedDocument等人(,它可以毫无问题地工作。

有人知道这个"窗口"吗?或者可能是什么原因造成的?

这是FixedPage.cs中试图获取我的项的父项的代码。我添加了评论。

internal int[] _CreateChildIndex(DependencyObject e)
{
ArrayList childPath = new ArrayList();
while (e != this)
{ 
// *** 'e' is an Image control, created by my view ***
// *** This value 'parent' is NULL if I mouse over too quickly ***
DependencyObject parent = LogicalTreeHelper.GetParent(e);
int childIndex = -1;
if (parent is FixedPage)
{
childIndex = ((FixedPage)parent).Children.IndexOf((UIElement)e);
}
else if (parent is Canvas)
{
childIndex = ((Canvas)parent).Children.IndexOf((UIElement)e);
}
else
{
// *** Because 'parent' is null, we end up here.  This call throws ***
IEnumerable currentChildrens = LogicalTreeHelper.GetChildren(parent);

这是抛出的代码

public static IEnumerable GetChildren(DependencyObject current)
{
if (current == null)
{
throw new ArgumentNullException("current"); 
}

这是鼠标悬停的调用堆栈。除了App.Run方法之外,这里没有我的任何代码。

System.Windows.LogicalTreeHelper.GetChildren    C#
System.Windows.Documents.FixedPage._CreateChildIndex    C#
System.Windows.Documents.FixedTextView.GetTextPositionFromPoint C#
MS.Internal.Documents.TextViewBase.System.Windows.Documents.ITextView.GetTextPositionFromPoint  C#
MS.Internal.Documents.DocumentPageTextView.GetTextPositionFromPoint C#
MS.Internal.Documents.MultiPageTextView.GetTextPositionFromPoint    C#
MS.Internal.Documents.TextViewBase.System.Windows.Documents.ITextView.GetTextPositionFromPoint  C#
System.Windows.Documents.TextEditorMouse.IsPointWithinInteractiveArea   C#
System.Windows.Documents.TextEditorMouse.OnQueryCursor  C#
System.Windows.RoutedEventArgs.InvokeHandler    C#
System.Windows.EventRoute.InvokeHandlersImpl    C#
System.Windows.UIElement.RaiseEventImpl C#
System.Windows.UIElement.RaiseTrustedEvent  C#
System.Windows.Input.InputManager.ProcessStagingArea    C#
System.Windows.Input.MouseDevice.UpdateCursorPrivate    C#
System.Windows.Input.MouseDevice.PostProcessInput   C#
System.Windows.Input.InputManager.RaiseProcessInputEventHandlers    C#
System.Windows.Input.InputManager.ProcessStagingArea    C#
System.Windows.Input.InputProviderSite.ReportInput  C#
System.Windows.Interop.HwndMouseInputProvider.ReportInput   C#
System.Windows.Interop.HwndMouseInputProvider.FilterMessage C#
System.Windows.Interop.HwndSource.InputFilterMessage    C#
MS.Win32.HwndWrapper.WndProc    C#
MS.Win32.HwndSubclass.DispatcherCallbackOperation   C#
System.Windows.Threading.ExceptionWrapper.InternalRealCall  C#
System.Windows.Threading.ExceptionWrapper.TryCatchWhen  C#
System.Windows.Threading.Dispatcher.LegacyInvokeImpl    C#
MS.Win32.HwndSubclass.SubclassWndProc   C#
[Native to Managed Transition]  
UserCallWinProcCheckWow Unknown
DispatchMessageWorker   Unknown
[Managed to Native Transition]  
System.Windows.Threading.Dispatcher.PushFrameImpl   C#
System.Windows.Threading.Dispatcher.PushFrame   C#
System.Windows.Threading.Dispatcher.Run C#
System.Windows.Application.RunDispatcher    C#
System.Windows.Application.RunInternal  C#
System.Windows.Application.Run  C#
MyCompany.App.Main  Unknown   
[Native to Managed Transition]  
coreclr_t::execute_assembly C++
run_app_for_context C++
run_app C++
corehost_main   C++
execute_app C++
`anonymous namespace'::read_config_and_execute  C++
fx_muxer_t::handle_exec_host_command    C++
fx_muxer_t::execute C++
hostfxr_main_startupinfo    C++
exe_start   C++
wmain   C++
[Inline Frame] invoke_main  C++
__scrt_common_main_seh  C++
BaseThreadInitThunk()  Unknown
RtlUserThreadStart()   Unknown

下面是我的视图(UserControl(的一个非常简短的版本,其中ItemsControl创建了Image元素

<UserControl
x:Class="Core.Views.LayerView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:cv="clr-namespace:Core.View"
>
<Canvas>
<ItemsControl ItemsSource="MyItems">
<ItemsControl.Resources>
<DataTemplate x:Key="PathOutputTemplate" DataType="{x:Type ShapeVm}">
<Path Stroke="Yellow" StrokeThickness="6" Data={Binding Geometry} />
</DataTemplate>
<DataTemplate x:Key="ImageOutputTemplate" DataType={x:Type ImageOutputVm}>
<Image Source="{Binding ImageSource}"/>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemTemplateSelector>
<cv:OutputTemplateSelector
PathTemplate="{StaticResource PathOutputTemplate}"
ImageTemplate="{StaticResource ImageOutputTemplate}"
/>
</ItemsControl.ItemTemplateSelector>
</ItemsControl>
</Canvas>
</UserControl>

我今天在创建新报告时遇到了这个问题,我想为未来遇到这个问题的开发人员发布我的解决方法。这真的是一个变通办法,而不是解决根本问题,因为我没有时间深入研究。

解决方法包括在我的图像控件上添加一个具有透明背景的边界控件,基本上防止任何鼠标事件触发以下内容:

<Grid>
<My-content-that-must-not-be-moused-over/>
<Border Background="Transparent"></Border>
<Grid>

相关内容

  • 没有找到相关文章

最新更新