如何链接滚动条和滚动查看器

2023-11-24

我目前有两个 ScrollViewer,其中包含同一集合的备用视图。我通过处理 ScrollChanged 事件并使用 ScrollToVerticalOffset 将两个滚动查看器的滚动绑定在一起。

出于演示原因,我已将两个 ScrollViewer 滚动条设置为隐藏,并希望从单独的 ScrollBar 控制它们。

这似乎并不简单。我记得几个月前看到过一篇关于它的博客,但我再也找不到了。

任何人都可以为我指明一些有用资源的方向,或者推动我朝着如何实现这一目标的正确方向前进。

提前致谢。


太棒了,正是我所需要的。我进行了一些扩展,以便也可以使用依赖属性从 xaml 设置滚动查看器。在 xaml 中:

<local:BindableScrollBar BoundScrollViewer ="{Binding ElementName=ScrollViewer}"  Orientation="Vertical" />

Code:

    /// <summary>
/// An extended scrollbar that can be bound to an external scrollviewer.
/// </summary>
public class BindableScrollBar : ScrollBar
{
    public ScrollViewer BoundScrollViewer
    {
        get { return (ScrollViewer)GetValue(BoundScrollViewerProperty); }
        set { SetValue(BoundScrollViewerProperty, value); }
    }

    // Using a DependencyProperty as the backing store for BoundScrollViewer.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty BoundScrollViewerProperty =
        DependencyProperty.Register("BoundScrollViewer", typeof(ScrollViewer), typeof(BindableScrollBar), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnBoundScrollViewerPropertyChanged)));

    private static void OnBoundScrollViewerPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        BindableScrollBar sender = d as BindableScrollBar;
        if (sender != null && e.NewValue != null)
        {
            sender.UpdateBindings();
        }
    }



    /// <summary>
    /// Initializes a new instance of the <see cref="BindableScrollBar"/> class.
    /// </summary>
    /// <param name="scrollViewer">The scroll viewer.</param>
    /// <param name="o">The o.</param>
    public BindableScrollBar(ScrollViewer scrollViewer, Orientation o)
        : base()
    { 
        this.Orientation = o;
        BoundScrollViewer = scrollViewer; 
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="BindableScrollBar"/> class.
    /// </summary>
    public BindableScrollBar() : base() { }

    private void UpdateBindings()
    {
        AddHandler(ScrollBar.ScrollEvent, new ScrollEventHandler(OnScroll));
        BoundScrollViewer.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(BoundScrollChanged));
        Minimum = 0;
        if (Orientation == Orientation.Horizontal)
        {
            SetBinding(ScrollBar.MaximumProperty, (new Binding("ScrollableWidth") { Source = BoundScrollViewer, Mode = BindingMode.OneWay }));
            SetBinding(ScrollBar.ViewportSizeProperty, (new Binding("ViewportWidth") { Source = BoundScrollViewer, Mode = BindingMode.OneWay }));
        }
        else 
        {
            this.SetBinding(ScrollBar.MaximumProperty, (new Binding("ScrollableHeight") { Source = BoundScrollViewer, Mode = BindingMode.OneWay }));
            this.SetBinding(ScrollBar.ViewportSizeProperty, (new Binding("ViewportHeight") { Source = BoundScrollViewer, Mode = BindingMode.OneWay })); 
        } 
        LargeChange = 242; 
        SmallChange = 16;
    }

    private void BoundScrollChanged(object sender, ScrollChangedEventArgs e) 
    { 
        switch (this.Orientation) 
        { 
            case Orientation.Horizontal:
                this.Value = e.HorizontalOffset;
            break;
            case Orientation.Vertical:
                this.Value = e.VerticalOffset; 
                break; 
            default:
                break; 
        }
    }

    private void OnScroll(object sender, ScrollEventArgs e) 
    {
        switch (this.Orientation) 
        {
            case Orientation.Horizontal:
                this.BoundScrollViewer.ScrollToHorizontalOffset(e.NewValue);
                break;
            case Orientation.Vertical:
                this.BoundScrollViewer.ScrollToVerticalOffset(e.NewValue);
                break; 
            default: 
                break; 
        } 
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何链接滚动条和滚动查看器 的相关文章

  • 如何检索 ComboBox 选定的值作为枚举类型?

    这是我的Enum code public enum EmployeeType Manager Worker 我将初始化ComboBox值 而表单将自身初始化为 combobox1 ItemsSource Enum GetValues typ
  • 如何绑定到 DynamicResource 以便可以使用 Converter 或 StringFormat 等? (修订版4)

    注意 这是对早期设计的修订 该设计具有无法在某种样式中使用的限制 从而大大削弱了其有效性 然而 这个新版本现在可以使用样式 本质上是让您可以在任何可以使用绑定或动态资源的地方使用它并获得预期的结果 从而使其更加有用 从技术上讲 这不是一个问
  • WPF 和 ClickOnce

    MSDN 未将 WPF exe 列为 ClickOnce 支持的应用程序类型 ClickOnce 应用程序是任何 Windows Presentation Foundation xbap Windows 窗体 exe 控制台应用程序 exe
  • 是否可以仅突出显示图像的某些部分(不透明度)?

    我已对图像应用了不透明度 这是代码
  • WPF:在关闭事件触发之前,不会提交对具有焦点的文本框的更改

    我有一个用于编辑数据库信息的 WPF 窗口 它使用实体框架对象表示 当用户关闭窗口时 我想在 Closing 事件中注意到信息是否已更改 并显示一个消息框 提供将更改保存到数据库的信息 不幸的是 在编辑失去焦点之前 对当前焦点编辑的更改不会
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 如何在 WPF 中设置覆盖全局样式的特定控制元素设置?

    我通过应用程序范围的资源字典为应用程序中的按钮定义了全局样式 样式如下所示 来自另一个 SO 示例
  • 使用 XAML 地图控件在基于 C# VS2013 WPF 的 OpenStreetMap 的地图上添加热图图层

    我正在尝试使用 XAML MAP 控件 https xamlmapcontrol codeplex com https xamlmapcontrol codeplex com 在基于 C VS2013 WPF 的 OpenStreetMap
  • 在 ViewModel 中使用 CollectionViewSource 的正确方法

    我使用拖放将数据源对象 数据库模型 绑定到DataGrid 基本上遵循这个例子实体框架与 WPF 的数据绑定 http msdn microsoft com en us data jj574514 通过这个实现 一切都运行良好 XAML
  • 什么是WPF浏览器应用程序类型项目?

    什么时候应该使用 WPF 浏览器应用程序 该项目类型有什么用处 开发人员什么时候应该使用这个 WPF 浏览器应用程序是在浏览器中作为 XBAP Xaml 浏览器应用程序 运行的应用程序 您可以找到有关 XBAP 的用途和原因的更多信息her
  • WPF 日历控件按住鼠标

    所以我放弃了标准的 WPFCalendarVS2010 中全新 WPF 应用程序中的 MainWindow xaml 控件 如果我单击日历中的某一天 然后尝试单击应用程序的 关闭 按钮 则我必须在关闭按钮上单击两次才能接受单击 它的表现就好
  • 如何使用故事板更改wpf中网格行的高度

    我有一个Grid有 2 行
  • GridViewColumn 中的 WPF 文本格式设置

    我想将格式 对齐文本 货币格式 0000 00 应用于 GridViewColumn 中的列
  • 带滚动条的 HTML 画布

    我正在宽度不等的画布上绘制图表 每个画布可以有自己的滚动条吗 我尝试将所有画布放在一个 div 中并指定最大宽度 但它不起作用 是否有可能所有画布在页面上的可见宽度均为 500 像素 并且每个画布都有其滚动条来查看画布的整个宽度 谢谢 指定
  • WPF 自定义控件 - ItemsControl 模板未应用

    我正在构建一个派生自 TabControl 的自定义 WPF 控件 在 ControlTemplate 中 我使用 ItemsControl 来显示从模板绑定的列表 FileMenuItem 类型的可观察集合 在程序执行期间 我在输出窗口中
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • WPF - 全局样式?

    有没有办法为我的 WPF 应用程序设置全局样式 我希望做的是将样式应用于所有也有图像子项的按钮 嗯 有点 这是您可以做的一种包罗万象的方法 将以下元素放入您的 App xaml 中 所有按钮都会发生变化 除了您手动应用样式的按钮 但是 如果
  • WindowsFormsHost ZOrder

    看起来 WindowsFormsHost 控件被设置为显示在顶部 有没有办法更改其 z 顺序 以允许同一窗口上的其他 WPF 控件在 WindowsFormsHost 控件之上可见 不幸的是 不能 由于 winformshost 合成到 W
  • 如何在MUI GridList中实现图块的水平滚动?

    这是我的 JS 页面 我需要在其中实现GridList组件显示多个图块 并且在列表大小超出屏幕限制后可水平滚动 import React useState from react import Header from common heade
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变

随机推荐