【问题标题】:what the name for the item in the green circle绿色圆圈中项目的名称是什么
【发布时间】:2010-12-21 05:32:04
【问题描述】:

绿色圆圈中的元素名称是什么?单击此元素对应的事件是什么?

【问题讨论】:

  • 是白色矩形吗?

标签: wpf datagrid wpf-controls


【解决方案1】:

有趣的是,DataGrid 的这一部分是无人区——它甚至没有正式名称,更不用说行为或模板了。要处理与该区域相关的事件,请参阅herehere

【讨论】:

    【解决方案2】:

    我称之为“全选”按钮。但是,它没有正式名称。它也没有暴露任何样式属性。有关通过附加属性设置样式的简单方法,请参见以下内容:

    http://www.scottlogic.co.uk/blog/colin/2009/02/styling-hard-to-reach-elements-in-control-templates-with-attached-behaviours/

    科林 E.

    【讨论】:

    • +1 链接,非常有帮助。我做了与这篇文章中介绍的几乎完全相同的事情来设计这个该死的按钮,因为当时我没有发现任何有用的东西。 MS 懒得给它起名字真是烦人....
    【解决方案3】:

    正如其他人所说,它是“全选”按钮。如果 SelectionMode 设置为 Extended,单击它将选择 DataGrid 中的所有内容。

    “全选”按钮是 DataGrid 模板的一部分。或者实际上,它是 ScrollViewer 模板的一部分,也是 DataGrid 模板的一部分,因此它嵌套得很深。 ControlTemplate 看起来像这样。从这里您可以使用 SelectAll 按钮执行任何操作、禁用它、更改背景等。

    <Style TargetType="{x:Type DataGrid}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGrid}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
                        <ScrollViewer x:Name="DG_ScrollViewer" Focusable="false">
                            <ScrollViewer.Template>
                                <ControlTemplate TargetType="{x:Type ScrollViewer}">
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition Width="*"/>
                                            <ColumnDefinition Width="Auto"/>
                                        </Grid.ColumnDefinitions>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"/>
                                            <RowDefinition Height="*"/>
                                            <RowDefinition Height="Auto"/>
                                        </Grid.RowDefinitions>
    
                                        <!-- Here it is -->
                                        <Button Command="{x:Static DataGrid.SelectAllCommand}" Focusable="false" Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
    
                                        <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Grid.Column="1" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                        <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" Grid.ColumnSpan="2" Grid.Row="1"/>
                                        <ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="2" Maximum="{TemplateBinding ScrollableHeight}" Orientation="Vertical" Grid.Row="1" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/>
                                        <Grid Grid.Column="1" Grid.Row="2">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                                <ColumnDefinition Width="*"/>
                                            </Grid.ColumnDefinitions>
                                            <ScrollBar x:Name="PART_HorizontalScrollBar" Grid.Column="1" Maximum="{TemplateBinding ScrollableWidth}" Orientation="Horizontal" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>
                                        </Grid>
                                    </Grid>
                                </ControlTemplate>
                            </ScrollViewer.Template>
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    【讨论】:

      【解决方案4】:

      如果你想禁用全选按钮,你也可以这样做:

        //Disable select all button
        datagrid.CommandBindings.Add(new CommandBinding(DataGrid.SelectAllCommand, delegate { }, (s, a) => { if (a.OriginalSource is Button) ((Button)a.OriginalSource).IsEnabled = false; }));
      

      作为一种解决方法。 这也可以用来连接其他东西。

      重新模板的“问题”是您必须考虑所有主题...乏味:)

      【讨论】:

        【解决方案5】:

        在我发现的至少一个示例中,单击角落的灰色三角形会导致所有行都被选中。

        但据我所知,这不是该控件的内置功能。它是自定义模板的一部分。

        看这个例子: http://www.dotnetspark.com/kb/2941-styling-wpf-datagrid.aspx

        如果您下载示例,并在 Resources/DataGridCustomization.xaml 文件中搜索“SelectAll”,您将找到包含此功能的模板部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-17
          • 2019-04-30
          • 2018-01-15
          • 2021-05-01
          • 1970-01-01
          • 2012-12-03
          • 2011-05-31
          相关资源
          最近更新 更多