小编use*_*286的帖子

WPF容器将所有子控件转为只读

我希望有一个WPF容器(面板,用户控件等)公开一个属性,以便将所有子项设置为只读(如果已设置).这应该就像将父控件设置为IsEnabled = false,这也会禁用所有子节点.应该考虑哪些孩子及其属性是固定的(例如TextBox.ReadOnly,DataGrid.ReadOnly,...).

我试图创建这样一个控件,它基本上迭代了可视树的所有子项(递归)并相应地处理控件.

这种方法很好,除了进一步更改会影响可视树的情况,以便添加新的子项.这对于ContentControl或ItemsControl都是如此.如果孩子们在浏览完它们后被添加到可视化树中,它们显然不是只读的.

我试图找到一个好的事件来做出反应(基本上在视觉树中检测新的孩子),但是找不到合适的东西.UpdateLayout被触发,但每次都经常通过可视树.

有办法解决这个问题吗?是否有另一种方法可以通过父元素上的绑定将所有(相关)子节点递归设置为只读?

(并且不会:我不希望将所有子项只读属性绑定到全局绑定.重点是将一个元素/部分传播给所有子节点)

c# wpf children visual-tree

17
推荐指数
1
解决办法
7460
查看次数

在 ScrollViewer 中使用 WPF DataGrid 虚拟化

我知道 DataGrid 支持虚拟化,因此它仅为可见行创建网格单元。但是,这似乎仅在 DataGrid 大小受到限制的情况下才有效。

在我的场景中,DataGrid 放置在滚动查看器内,如下所示

<ScrollViever>
    <StackPanel>

        <more elements .../>

        <DataGrid ... />

        <more elements .../>

    </StackPanel>
</ScrollViever>
Run Code Online (Sandbox Code Playgroud)

这似乎破坏了虚拟化。在 DataGrid 应显示大量项目的情况下,即使在外部 ScrollViewer 中向下滚动之前,视觉树也会变得非常大。

有什么方法可以防止 DataGrid 预先创建所有单元格,而是在 ScrollViewer 向下滚动时创建它们?

编辑:基本上,托管此内容的页面应该像一个网页,顶部有一些文本,底部有一个大表格和更多文本。整个页面应该滚动,而不是顶部/底部始终可见且仅滚动网格的停靠视图。该设置实现了这一点,但由于一切都是预先创建的而受到影响。

另一个编辑:有没有办法检测数据网格的特定行已滚动到视图中?典型的延迟加载文章使用数据网格的滚动查看器向网格添加更多项目,这在这里不起作用。

wpf datagrid virtualizingstackpanel

5
推荐指数
1
解决办法
5274
查看次数