- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
ListBox
(纯 WPF,System.Windows.Controls.ListBox
)出现问题,其中的项目包含 ListBox
(也是普通的 WPF)他们自己。在我的生产应用程序(使用 DevExpress 控件)中,当创建外部 ListBox
时,它会立即向下滚动(但明显),以便最后一个内部 ListBox< 中的第一个项目
可见。
我尝试用一个没有 DevExpress 的最小应用程序和一个使用 DevExpress 的应用程序重现此行为。两者都没有表现出这种行为。
我已将处理程序附加到(外部)ListBox
的 ScrollViewer
的 ScrollChanged
,我看到了导致滚动,但我无法弄清楚它的来源。
旁注:如果我将 ListBox
之一(无论内部还是外部)设为 DevExpress-ListBoxEdit
,滚动问题就会消失。但是,我无法执行此操作,因为当我单击项目时,我得到关于在枚举期间更改集合的 InvalidOperationException
。而且我不需要也不想要 ListBoxEdit
功能。
第二个旁注:我尝试删除外部 ListBox
的主题 (ThemeManager.ThemeName="None"
),但没有效果。
所以问题是我怎样才能找出是谁导致了滚动(以防止他这样做)?
更新:聚焦外部列表框的第一项不会改变任何内容。
更新:订阅 RequestBringIntoView
并设置 Handled=true
可以解决问题,但前提是我要闯入那里。没有断点,它什么也不做。堆栈跟踪本身没有告诉我任何信息:
bei MyApp.MyAppControls.BackToToTopListBox.OnRequestBringIntoView(Object sender, RequestBringIntoViewEventArgs requestBringIntoViewEventArgs)
bei System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
bei System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
bei System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
bei System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
bei System.Windows.Controls.ScrollViewer.ExecuteNextCommand()
bei System.Windows.Controls.ScrollViewer.OnLayoutUpdated(Object sender, EventArgs e)
bei System.Windows.ContextLayoutManager.fireLayoutUpdateEvent()
bei System.Windows.ContextLayoutManager.UpdateLayout()
bei System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg)
bei System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
bei System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
bei System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
bei System.Windows.Threading.DispatcherOperation.InvokeImpl()
bei MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Windows.Threading.DispatcherOperation.Invoke()
bei System.Windows.Threading.Dispatcher.ProcessQueue()
bei System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
bei System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
bei MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
bei MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
bei System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
bei System.Windows.Application.RunDispatcher(Object ignore)
bei System.Windows.Application.RunInternal(Window window)
bei MyApp.MAT.App.Main()
最佳答案
您可以通过将其控件模板更改为更简单的内容来从 ListBox 中删除 ScrollViewer:
<ListBox>
<ListBox.Template>
<ControlTemplate>
<ItemsPresenter />
</ControlTemplate>
</ListBox.Template>
...
</ListBox>
但是,我质疑嵌套列表框的值(value)。请记住,每个 ListBox 都是一个选择器,并且具有“选择”哪个项目的概念。将所选项目置于所选项目内,在所选项目内,真的有意义吗?
我建议将“内部”ListBoxes 更改为简单的 ItemsControls,这样嵌套列表就不会包含选定的项目。这将带来更简单的用户体验。您可能仍需要以相同的方式重新模板化内部 ItemsControls 以删除滚动条,但至少用户不会对哪个项目被“选中”感到困惑。
关于c# - Scrollviewer 正在自行向下滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57808295/
我发现以下帖子非常有帮助: How to pickle yourself? 但是,此解决方案的局限性在于,重新加载类时,它不会以其“运行时”状态返回。即它将重新加载所有变量等以及类在转储时的一般状态.
我是一名优秀的程序员,十分优秀!