水平滚动时保持树视图最左边的列可见

2024-04-04

我使用 ControlTemplate 和 GridViewRowPresenter 的堆栈面板在 WPF 中实现了带有列的树视图。我关注了这篇文章:http://blogs.msdn.com/b/atc_avalon_team/archive/2006/03/01/541206.aspx http://blogs.msdn.com/b/atc_avalon_team/archive/2006/03/01/541206.aspx

它工作完美!

但是,我想在水平滚动时保持左栏(带有名称)可见。

这就像 Microsoft Excel 上第一列的“冻结窗格”。

一个想法,有人吗?

谢谢 弗雷德里克


问题与GridViewRowPresenter解决方案是树与其他列密不可分。我想你需要它是分开的,这样你就可以只水平放置ScrollViewer围绕列,我怀疑这对您链接的文章中的项目是否容易(如果可能)进行。

我为了解决这个问题而拼凑起来的这个项目的边缘相当粗糙。有许多问题需要单独解决,但我没有进行微调:

  1. 模板和样式以使线条匹配,以及其他视觉调整。
  2. 重新介绍GridView标题和列的链接项目的各个方面。
  3. 用于调整第一列(包含树)大小的拆分器。

就像文章项目一样,我使用了一棵树Type对象作为数据源。

让它工作的关键是将数据对象包装在一个ExpandingContainer目的。这个 INPC 课程的重要内容是IsExpanded属性(用于绑定)和子集合:

public class ExpandingContainer : INotifyPropertyChanged {
    public object Payload { get; private set; }

    public ObservableCollection<ExpandingContainer> Children { get; private set; }

    public ExpandingContainer( object payload ) { ... }

    private bool _isexpanded;
    public bool IsExpanded {
        get { return _isexpanded; }
        set {
            if ( value == _isexpanded )
                return;
            _isexpanded = value;
            PropertyChanged.Notify( () => IsExpanded );
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = (o,e) => {};
}

至于 XAML,首先让我们获取一些资源:

<!-- bind ExpandingContainer.IsExpanded to TreeViewItem.IsExpanded -->
<Style TargetType="TreeViewItem">
    <Setter Property="IsExpanded"
            Value="{Binding IsExpanded, Mode=TwoWay}" />
</Style>

<!-- for binding ExpandingContainer.IsExpanded to visibility later -->
<BooleanToVisibilityConverter x:Key="boolvis" />

<!-- the TreeViewItems should display the Type's name -->
<HierarchicalDataTemplate DataType="{x:Type loc:ExpandingContainer}"
                          x:Key="treeViewSide"
                          ItemsSource="{Binding Children}">
    <TextBlock Text="{Binding Payload.Name}" />
</HierarchicalDataTemplate>

<!-- the column side are naively simple, the ItemsControl of children has its
     visibility bound to ExpandingContainer, but the "columns" are just
     StackPanels of TextBlocks -->
<HierarchicalDataTemplate DataType="{x:Type loc:ExpandingContainer}"
                          x:Key="columnSide">
    <StackPanel>
        <StackPanel.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Margin" Value="10,0" />
            </Style>
        </StackPanel.Resources>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Payload.IsAbstract}" />
            <TextBlock Text="{Binding Payload.Namespace}" />
            <TextBlock Text="{Binding Payload.GUID}" />
        </StackPanel>
        <ItemsControl ItemsSource="{Binding Children}"
                      Visibility="{Binding IsExpanded, Converter={StaticResource boolvis}}" />
    </StackPanel>
</HierarchicalDataTemplate>

<!-- a style can't refer to itself, so this was just to apply it to all ItemsControls -->
<Style TargetType="ItemsControl">
    <Setter Property="ItemTemplate"
            Value="{StaticResource columnSide}" />
</Style>

我最初尝试嵌套水平方向ScrollViewer包含仅垂直内的右列ScrollViewer那是负责的TreeView,但这产生了一个奇怪的要求,即您必须滚动到底部才能水平滚动。所以我把它们进一步分开,把ScrollViewer并排。

为了使垂直滚动条保持在最右侧,我将两个滚动条隐藏在TreeView并仅使用列周围的滚动条。同步垂直滚动是在代码隐藏中完成的,但对于更 MVVM 的方式来执行此操作,您可以创建附加行为以方便将它们相互绑定。

<DockPanel>
    <ScrollViewer VerticalScrollBarVisibility="Hidden"
                  HorizontalScrollBarVisibility="Hidden"
                  DockPanel.Dock="Left"
                  Name="treescroller">
        <TreeView ItemsSource="{Binding Items}"
                  ItemTemplate="{StaticResource treeViewSide}"
                  Padding="0,0,0,20">
        </TreeView>
    </ScrollViewer>
    <ScrollViewer Name="columnscroller"
                  HorizontalScrollBarVisibility="Auto"
                  VerticalScrollBarVisibility="Auto"
                  ScrollChanged="columnscroller_ScrollChanged">
        <ItemsControl ItemsSource="{Binding Items}" />
    </ScrollViewer>
</DockPanel>

最后,代码隐藏的重要部分(减去创建数据对象并设置DataContext财产):

private void columnscroller_ScrollChanged( object sender, ScrollChangedEventArgs e ) {
    treescroller.ScrollToVerticalOffset( columnscroller.VerticalOffset );
}

希望它能有所帮助,或者至少提供一个不同的视角。

如果我真的需要一款能够满足我能想到的混合动力车的所有需求的好车TreeView+ListView,我可能会先看看专业的控件,然后再花必要的时间来完善本土解决方案。当这样的显示要求比较简单的时候,这种东西比较好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

水平滚动时保持树视图最左边的列可见 的相关文章

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • 如何使用 Python 裁剪通过鼠标单击选择的区域?

    我正在使用 Matplotlib 和 PIL 使用 python 需要查看图像选择并剪切我必须处理的区域 只留下所选区域的图像 我已经知道如何使用 pil 剪切 imagens 使用im crop 但是我如何选择坐标来通过鼠标单击裁剪图像
  • 调试 SSIS 包 - debug.writeline

    SSIS 中的调试体验不是我所期望的 我有一个脚本任务 我添加了一个Imports System Diagnostics在类的标题处 在代码中我有各种 debug writeline 尝试移动文件 类型的消息 但是 它们没有显示在输出窗口中
  • 如何开始测试(jMock)

    我正在尝试学习如何编写测试 我也在学习 Java 有人告诉我应该学习 使用 练习 jMock 我在网上找到了一些在一定程度上有帮助的文章 例如 http www theserverside com news 1365050 Using JM
  • 如何在画布上绘制圆的下半部分

    我正在尝试使用适当的 x cos theta y sin theta 函数绘制圆的下半部分 如果我将 theta 从 Math PI 迭代到 2 Math PI 我似乎得到了圆的上半部分 我在这段代码片段中做错了什么 window onlo
  • 如何使用 jest 和 TypeScript 模拟第三方 Nodejs 模块函数?

    我正在尝试模拟第三方节点模块中的函数 特别是fs readFileSync 功能 使用玩笑 那里有很多示例 但我还没有找到使用 TypeScript 的示例 我有一个简单的 希望是最小的例子 位于github https github co
  • .net 中的 [] 括号是什么? [复制]

    这个问题在这里已经有答案了 我在 C 中很少看到 这样的括号 但是当我开始学习 ASP NET 时 我已经看到它们很多次了 但我仍然无法理解它们的作用 它们不是用于数组的代码的一部分 例如 webmethods 就在方法之上 或者有一些在类
  • Android 10 后台扫描时有限制吗?

    Android 上的蓝牙扫描似乎有很多 隐藏功能 对于初学者来说 有一个 30 秒的限制 Android 7 0 ble扫描没有结果 https stackoverflow com questions 43114913 android 7
  • Python 缩进之谜

    为什么我会收到以下错误 最后print声明不应成为while loop gt gt gt while n gt 0 n n 1 print n print TO A File
  • 从给定的数据集 [纬度、经度、密度] 生成 KML 热图

    我希望构建一个静态 KML Google 地球标记 文件 该文件以 lat lon densis 元组的形式显示一些给定数据集的热图样式渲染 我拥有的一个非常简单的数据集是人口密度 我的要求是 必须能够输入给定纬度 经度的数据 必须能够指定
  • 为什么 solr RemoveDuplicatesTokenFilterFactory 不起作用?

    我的 schema xml 正在拆分产品名称 然后使用RemoveDuplicate 删除拆分后的重复单词
  • graph-tool 需要哪些安装依赖项/选项才能包含draw_hierarchy?

    我已经在 ubuntu 14 04 python 3 5 4 上安装了 graph tool 2 26 我可以使用图形工具 但它似乎不完整 例如我见过这个错误 AttributeError module graph tool draw ha
  • MvcContrib.MVC3-ci 和 Mvc.Contrib NuGet 包之间有什么区别?

    MvcContrib MVC3 ci 和 Mvc Contrib NuGet 包之间有什么区别 我看到它们有不同的依赖项 ci 有更多的下载 我假设我的 MVC3 项目需要 ci 但我如何解决这个问题 ci 是什么意思 据我收集的信息 MV
  • C# 中的三元运算符 (?:) 线程安全吗?

    考虑以下两种获得较大数字的替代方案currentPrice and 100 int price currentPrice gt 100 currentPrice 100 int price Math Max currentPrice 100
  • docker swarm init 无法选择 IP 地址错误

    尝试码头工人群 with 适用于 Mac 的 Docker 桌面 我试过这个 docker machine create d virtualbox node 1 docker machine create d virtualbox node
  • NSString:去掉 并为该段创建带有颜色的属性字符串?

    假设我有一个字符串 这是一个简单的字符串 我需要去掉 抱歉 b 和尖括号之间没有空格 由于某种原因预览没有显示它 同时将 simple 这个词加粗 我的想法是 将尖括号和 br 替换为空白 使 简单 段具有属性 问题是一旦标签被删除 我仍然
  • Eclipse Helios 不显示 Javadoc

    我最近买了一台新计算机 并在其中安装了 Eclipse Helios 之前 在我的旧计算机上 当我使用控制辅助 Ctrl 空格 并突出显示建议的方法时 该方法的 Javadoc 经常出现在控制辅助弹出窗口的一侧 其中包含方法描述和参数等 然
  • 锁定或保护 R 中的 data.table

    是否有一种或多种方法可以锁定或保护data table这样就不能再就地修改了 假设我们有一个 data table dt lt data table id 1 val foo dt id val 1 1 foo 然后我可以修改吗dt之后得到
  • Dockerfile - 中间容器到底在做什么?

    我有我的 Dockerfile 如下所示 FROM confluentinc cp kafka connect 4 0 0 ARG VERSION 0 0 2 15 RUN curl Ls https github com jcustenb
  • 在 C 编译时检查类型是结构体还是指针?

    注意 这是NOTPaul T 链接的问题的重复项 因为我问是否可以在编译时确定类型是否属于某种更广泛的不完整类型 种类 而不是在编译时是否已注册符号 这似乎是对这个问题的根本误解 我正在用 C 编写一个库 该库处理伪通用函数 该函数通过宏包
  • 水平滚动时保持树视图最左边的列可见

    我使用 ControlTemplate 和 GridViewRowPresenter 的堆栈面板在 WPF 中实现了带有列的树视图 我关注了这篇文章 http blogs msdn com b atc avalon team archive