gpt4 book ai didi

c# - 在没有代码隐藏的情况下同步两个 ScrollViewer 之间的偏移量

转载 作者:太空宇宙 更新时间:2023-11-03 13:29:45 26 4
gpt4 key购买 nike

现在我有两个滚动查看器,它们都需要始终具有相同的偏移量。

我现在拥有的(可行的)解决方案是使用 ScrollChanged 事件。如果触发 ScrollChanged 事件,则执行此代码:

scrollViewer.ScrollToHorizontalOffset(offset.X);
scrollViewer.ScrollToVerticalOffset(offset.Y);

事实上,我想尽量避免这种代码隐藏解决方案。

我认为这个问题的最佳解决方案是这样的(绑定(bind)):

 <ScrollViewer x:Name="scrollviewer_Top" HorizontalOffset="{Binding ElementName=scrollViewer_Center, Path=HorizontalOffset}">...</ScrollViewer>

<ScrollViewer x:Name="scrollViewer_Left" VerticalOffset="{Binding ElementName=scrollViewer_Center, Path=VerticalOffset}" >...</ScrollViewer>

<ScrollViewer x:Name="scrollViewer_Center" HorizontalOffset="{Binding ElementName=scrollviewer_Top, Path=HorizontalOffset}"
VerticalOffset="{Binding ElementName=scrollViewer_Left, Path=VerticalOffset}">...</ScrollViewer>

现在,当我尝试构建时出现了一些错误(无法设置 Horizo​​ntalOffset/VerticalOffset,因为它没有可访问的设置访问器)。

有谁知道这是否是最佳解决方案以及如何处理错误?还是我应该留在代码隐藏事件中?

谢谢

最佳答案

虽然在这种情况下使用代码隐藏没有任何问题,但在将 WPF 与 MVVM 一起使用时,通常习惯将事件处理封装到附加属性中。所以,如果您真的想摆脱背后的代码,您可以这样做。请引用Attached Properties Overview MSDN 上的页面以获取附加属性的详细说明。

在你的情况下,你可以这样做:

public static readonly DependencyProperty LinkedScrollViewerProperty = DependencyProperty.RegisterAttached("LinkedScrollViewer", typeof(ScrollViewer), typeof(ScrollViewerProperties), new UIPropertyMetadata(null, OnLinkedScrollViewerChanged));

public static ScrollViewer GetLinkedScrollViewer(DependencyObject dependencyObject)
{
return (ScrollViewer)dependencyObject.GetValue(LinkedScrollViewerProperty);
}

public static void SetLinkedScrollViewer(DependencyObject dependencyObject, ScrollViewer value)
{
dependencyObject.SetValue(LinkedScrollViewerProperty, value);
}

public static void OnLinkedScrollViewerChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
ScrollViewer scrollViewer = (ScrollViewer)dependencyObject;
ScrollViewer newLinkedScrollViewer = e.NewValue as ScrollViewer;
if (newLinkedScrollViewer != null)
{
newLinkedScrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset);
newLinkedScrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset);
}
}

如果这是在一个名为 ScrollViewerProperties 且 Xml 命名空间前缀为 Attached 的类中,那么您可以像这样使用它:

<ScrollViewer Name="ScrollViewerToLinkWith" ... />
...
<ScrollViewer Attached:ScrollViewerProperties.LinkedScrollViewer="{Binding
ElementName=ScrollViewerToLinkWith}" ... />

目前我无法检查它,因此您可能需要对其进行调整,但它看起来是正确的。此外,您几乎可以像这样处理任何 UI 事件。

关于c# - 在没有代码隐藏的情况下同步两个 ScrollViewer 之间的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21039495/

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