【问题标题】:WPF How to create a grid that can scroll with static column and row headerWPF如何创建一个可以滚动静态列和行标题的网格
【发布时间】:2016-09-07 04:12:09
【问题描述】:

我创建了一个带有列和行标题的自定义网格。网格中的单元格是空的。我想要做的是为它创建一个类似于 excel 的滚动行为。我需要添加一个水平和垂直滚动条。当您垂直滚动时,我需要列标题保持原位并滚动行标题。当您水平滚动时,我需要将行列保持在原位并滚动列标题。这是我目前拥有的网格代码:

<Canvas x:Name="canvas_blueprint" ClipToBounds="True" Width="{Binding ActualWidth, ElementName=canvas}" Height="{Binding ActualHeight, ElementName=canvas}">
            <DockPanel>
                <Grid x:Name="grid_column_header" DockPanel.Dock="Top" Height="25" Width="{Binding ActualWidth, ElementName=canvas}"></Grid>
                <Grid x:Name="grid_row_header" DockPanel.Dock="Left" Width="25" Height="{Binding ActualHeight, ElementName=canvas}" Margin="0,-25,0,0"></Grid>
                <Grid x:Name="grid_blueprint" DockPanel.Dock="Right" Height="{Binding ActualHeight, ElementName=image_blueprint}" Width="{Binding ActualWidth, ElementName=image_blueprint}">
                    <Grid.Background>
                        <ImageBrush x:Name="imagebrush_blueprint"/>
                    </Grid.Background>
                </Grid>
            </DockPanel>
        </Canvas>

基本上它是一个带有包含 3 个网格的停靠面板的画布。标题为 2 个网格,内部单元格为 1 个网格。单元格是动态创建的。

我正在制作自定义网格,因为我需要在网格上叠加背景图像。我尝试使用免费的电子表格控件,但没有找到可以有背景图像的控件。我的网格需要具备的唯一其他行为是选择一个单元格或一系列单元格的能力。

我尝试过使用网格的滚动条和滚动查看器,但这会使线条不稳定且不均匀。我对 WPF 编程并不陌生,但我离专家还很远。任何帮助将不胜感激。

【问题讨论】:

  • 我们的答案可以涉及摆脱画布,还是您将其用于您提供的代码中没有的特定内容?
  • 当然你可以摆脱画布。

标签: c# .net wpf


【解决方案1】:

我会使用一个简单的DataGrid。它已经自动冻结标题,您可以通过FrozenColumnCount 属性冻结列。

您可以通过将Background 属性设置为ImageBrush 来获得背景图像。

可以通过将SelectionMode 设置为DataGridSelectionMode.Extended 来控制选择范围。

以下是如何将特殊背景颜色和其他类型的格式应用于单个单元格:

<DataGrid.CellStyle> 
    <Style TargetType="{x:Type wpf:DataGridCell}">  
        <Setter Property="Background" Value="{Binding SomeColorProperty, Converter={StaticResource cellBackgroundConverter}}" />   
        <Setter Property="FontWeight" Value="{Binding SomeWeightProperty, Converter={StaticResource cellWeightConverter}}" /> 
        .....
    </Style> 
</DataGrid.CellStyle> 

【讨论】:

  • 如果我以这种方式使用数据网格,我可以像在 excel 中那样使用空单元格吗?基本上我想要网格线,但我希望能够选择一个“单元格”以便能够向该“单元格”添加一个定制样式。我还需要能够突出显示选定的单元格。
  • 可以通过这种方式进行选择,但是像这样格式化单个单元格会变得很棘手。您期望有什么样的格式变化?您是否在此应用程序中使用 MVVM 模式?
  • 我只熟悉这将如何使用 MVVM 工作,我从未尝试在代码隐藏中做到这一点。基本思想是在网格上设置CellStyle,用Setter 设置特定属性(背景、字体样式、字体粗细等),以及绑定到视图模型上的属性的值的细胞。可能需要ValueConverter
  • 是的,我正在使用 MVVM 模式。变化将是边框可以是黑色或红色。该格式有一堆需要在那里的信息。基本上它会有几个数字和一个文本。这就是为什么我要使用自定义网格,这样我就可以在每个单元格中使用简单的网格布局来自定义单元格。这是我现在唯一遇到的问题。我不确定数据网格会起作用。我确实调查过。
  • 我已经用一些格式化示例代码更新了我的答案。我建议你先在一个测试项目中尝试这个,这样你就不会弄乱你的大部分工作的现有代码。 DataGrid 并不是专门为此而设计的,因此可能需要稍微调整一下,但我仍然认为它是最适合您需求的控件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2020-11-15
  • 2013-01-25
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多