【问题标题】:Making Silverlight Datagrid cells non-selectable使 Silverlight Datagrid 单元格不可选择
【发布时间】:2010-12-11 12:00:25
【问题描述】:

我有一个 DataGrid,我将它绑定到一个 PagedCollectionView,它是分组和排序的。 DataGrid 的内容不可编辑,尽管其中一列包含可点击的链接。

我已将 DataGrid 的 SelectionMode 限制为 DataGridSelectionMode.Single,这会停止多行选择,这很好。但是选定的行也有一个选定的单元格,该单元格的绘制颜色比选定行的其余部分略浅,并且有一个边框。

基本上我想要一个 SelectedRow 而不是 SelectedCell(从 UI/显示的角度来看)。

感觉设置属性应该很简单,但我觉得可能我必须编辑 DataGrids 模板和/或弄乱 VisualStateManager。

我很高兴切换到 DataGrid 以外的其他控件,但我确实需要能够显示 Grouping。

【问题讨论】:

    标签: silverlight silverlight-3.0 datagrid selection


    【解决方案1】:

    还可以添加“不可见”列:

        <sdk:DataGrid.Columns>
        <sdk:DataGridTextColumn Binding="{Binding Path=Nothing}" MinWidth="0" MaxWidth="0" />
    

    并在当前单元格更改时使其成为当前单元格:

    Private Sub _CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.CurrentCellChanged
        If Me.CurrentColumn IsNot Nothing Then Me.CurrentColumn = Me.Columns(0)
    End Sub
    

    这很适合我。

    【讨论】:

    • 很狡猾,但是让我觉得有点脏。不过可能比大量的控制模板更好。
    【解决方案2】:

    我发现了一种使单个单元格看起来未被选中的方法,尽管我不确定它是否是最好的方法。
    编辑 DataGrid 的 CellStyle,找到名为 FocusVisual 的 Rectangle。这是用于指示选定单元格的矩形。将其 Fill & Stroke 设置为透明,我还将其 StrokeThickness 设置为 0。不要完全删除 Rectangle,因为其他东西都希望它在那里。 xaml 看起来像这样:

        <Style x:Key="NonSelectableDataGridCellStyle" TargetType="data:DataGridCell">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Stretch"/>
            <Setter Property="IsTabStop" Value="False"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="data:DataGridCell">
                        <Grid x:Name="Root" Background="{TemplateBinding Background}">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CurrentStates">
                                    <VisualState x:Name="Regular"/>
                                    <VisualState x:Name="Current">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" 
                                                Storyboard.TargetName="FocusVisual" 
                                                Storyboard.TargetProperty="Opacity" To="1"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="ValidationStates">
                                    <VisualState x:Name="Valid"/>
                                    <VisualState x:Name="Invalid">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" Storyboard.TargetName="InvalidVisualElement" Storyboard.TargetProperty="Opacity" To="1"/>
                                            <ColorAnimation Duration="0" Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="(Fill).Color" To="#FFFFFFFF"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Rectangle x:Name="FocusVisual" 
                                Fill="Transparent"
                                Stroke="Transparent"
                                StrokeThickness="0" 
                                HorizontalAlignment="Stretch" 
                                VerticalAlignment="Stretch" 
                                IsHitTestVisible="false" 
                                Opacity="0"
                                       />
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
                            <Rectangle x:Name="InvalidVisualElement" Stroke="#FFDC000C" StrokeThickness="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsHitTestVisible="False" Opacity="0"/>
                            <Rectangle x:Name="RightGridLine" VerticalAlignment="Stretch" Width="1" Grid.Column="1"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

    然后将 CellStyle 添加到 DataGrid

    <data:DataGrid x:Name="uiDataGrid" 
               CellStyle="{StaticResource NonSelectableDataGridCellStyle}"
               >
         ...
    </data:DataGrid>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      相关资源
      最近更新 更多