gpt4 book ai didi

c# - Scrollviewer 正在自行向下滚动

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:37 24 4
gpt4 key购买 nike

ListBox(纯 WPF,System.Windows.Controls.ListBox)出现问题,其中的项目包含 ListBox(也是普通的 WPF)他们自己。在我的生产应用程序(使用 DevExpress 控件)中,当创建外部 ListBox 时,它会立即向下滚动(但明显),以便最后一个内部 ListBox< 中的第一个项目 可见。

我尝试用一​​个没有 DevExpress 的最小应用程序和一个使用 DevExpress 的应用程序重现此行为。两者都没有表现出这种行为。

我已将处理程序附加到(外部)ListBoxScrollViewerScrollChanged,我看到了导致滚动,但我无法弄清楚它的来源。

旁注:如果我将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com