2009-06-26 48 views
12

Khi người dùng nhấp vào một hàng trong bảng dữ liệu (hoặc sử dụng bàn phím), hàng đó được chọn, nhưng ô cụ thể mà họ nhấp vào cũng được tập trung đặc biệt. Điều này là tốt cho một lưới chỉnh sửa dữ liệu, nhưng tôi đang cố gắng để tạo ra một cái gì đó giống như một hộp thoại mở cho thấy tài sản cho mỗi mục trong danh sách, vì vậy ...Chỉ đánh dấu toàn bộ các hàng trong Silverlight DataGrid

Có thể cấu hình DataGrid (chỉ đọc) rằng người dùng chỉ có thể chọn hoặc tập trung vào toàn bộ hàng, chứ không phải các trường riêng lẻ.

Nếu điều đó là không thể, có cách tao nhã để chỉ chọn phần tử đầu tiên - ví dụ trong hộp thoại Windows Open chuẩn, nếu bạn đổi sang dạng xem chi tiết có một số cột cho mỗi hàng (tên tệp, ngày tạo , Kích thước, v.v.) nhưng bạn chỉ có thể đánh dấu các mục trong cột tên tệp.

Trả lời

8

Đây là của tôi (què) phiên bản đó cho biết thêm một nền đen trên hàng đã chọn và nền màu xám trên hàng hiện tại. Tôi đã phải ghi đè lên phong cách bởi vì tôi đã vẽ các ô riêng lẻ và hàng được chọn đã bị ẩn.

Chỉ cần thêm đoạn code dán vào bạn dụ DataGrid:

 <local:DataGrid.RowStyle> 
      <Style TargetType="local:DataGridRow"> 
       <Setter Property="IsTabStop" Value="False" /> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="local:DataGridRow"> 
          <localprimitives:DataGridFrozenGrid Name="Root"> 
           <vsm:VisualStateManager.VisualStateGroups> 
            <vsm:VisualStateGroup x:Name="CommonStates"> 
             <vsm:VisualStateGroup.Transitions> 
              <vsm:VisualTransition GeneratedDuration="0" /> 
             </vsm:VisualStateGroup.Transitions> 
             <vsm:VisualState x:Name="Normal" /> 
             <vsm:VisualState x:Name="Normal AlternatingRow"> 
              <Storyboard> 
               <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="0"/> 
              </Storyboard> 
             </vsm:VisualState> 
             <vsm:VisualState x:Name="MouseOver"> 
              <Storyboard> 
               <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To=".5"/> 
              </Storyboard> 
             </vsm:VisualState> 
             <vsm:VisualState x:Name="Normal Selected"> 
              <Storyboard> 
               <DoubleAnimation Storyboard.TargetName="BackgroundRectangleSelected" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
              </Storyboard> 
             </vsm:VisualState> 
             <vsm:VisualState x:Name="MouseOver Selected"> 
              <Storyboard> 
               <DoubleAnimation Storyboard.TargetName="BackgroundRectangleSelected" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
              </Storyboard> 
             </vsm:VisualState> 
             <vsm:VisualState x:Name="Unfocused Selected"> 
              <Storyboard> 
               <DoubleAnimation Storyboard.TargetName="BackgroundRectangleSelected" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
               <ColorAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="BackgroundRectangleSelected" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> 
                <SplineColorKeyFrame KeyTime="0" Value="Black"/> 
               </ColorAnimationUsingKeyFrames> 
              </Storyboard> 
             </vsm:VisualState> 
            </vsm:VisualStateGroup> 
           </vsm:VisualStateManager.VisualStateGroups> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="*"/> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="Auto"/> 
           </Grid.RowDefinitions> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition Width="*" /> 
           </Grid.ColumnDefinitions> 

           <Grid.Resources> 
            <Storyboard x:Key="DetailsVisibleTransition"> 
             <DoubleAnimation Storyboard.TargetName="DetailsPresenter" Storyboard.TargetProperty="ContentHeight" Duration="00:00:0.1" /> 
            </Storyboard> 
           </Grid.Resources> 

           <Rectangle x:Name="BackgroundRectangle" Grid.RowSpan="2" Grid.ColumnSpan="2" Opacity="0" Fill="#FFBADDE9"/> 
           <Rectangle x:Name="BackgroundRectangleSelected" Grid.RowSpan="2" Grid.ColumnSpan="2" Opacity="0" Fill="Black"/> 

           <localprimitives:DataGridRowHeader Grid.RowSpan="3" Name="RowHeader" localprimitives:DataGridFrozenGrid.IsFrozen="True" /> 
           <localprimitives:DataGridCellsPresenter Margin="2" Grid.Column="1" Name="CellsPresenter" localprimitives:DataGridFrozenGrid.IsFrozen="True" /> 
           <localprimitives:DataGridDetailsPresenter Grid.Row="1" Grid.Column="1" Name="DetailsPresenter" /> 
           <Rectangle Grid.Row="2" Grid.Column="1" Name="BottomGridLine" HorizontalAlignment="Stretch" Height="1" /> 
          </localprimitives:DataGridFrozenGrid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </local:DataGrid.RowStyle> 
1

Bạn có thể tạo một phong cách như các mẫu để làm nổi bật và sắp xếp tôi có:

<!-- Right Aligned Cell --> 
    <Style x:Key="RightAlignedCell" TargetType="{x:Type dg:DataGridCell}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type dg:DataGridCell}"> 
        <Grid Background="{TemplateBinding Background}"> 
         <ContentPresenter HorizontalAlignment="Right" VerticalAlignment="Center"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="dg:DataGridCell.IsSelected" Value="True"> 
       <Setter Property="Background" Value="#356815" /> 
       <Setter Property="Foreground" Value="#e2fce2" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

    <!-- Center Aligned Cell --> 
    <Style x:Key="CenterAlignedCell" TargetType="{x:Type dg:DataGridCell}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type dg:DataGridCell}"> 
        <Grid Background="{TemplateBinding Background}"> 
         <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="dg:DataGridCell.IsSelected" Value="True"> 
       <Setter Property="Background" Value="#356815" /> 
       <Setter Property="Foreground" Value="#e2fce2" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

sau đó bạn đặt:

<dg:DataGrid x:Name="dg" AutoGenerateColumns="False" 
      xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" ItemsSource="{Binding}" 
      SelectionMode="Single" ...> 
    <dg:DataGridTextColumn Header="Total Amount" Width="110" CellStyle="{StaticResource RightAlignedCell}" 
            Binding="{Binding Total,StringFormat={}\{0:N0\}}" IsReadOnly="True"/> 
    <dg:DataGridTextColumn Header="Enter Date" Width="110" CellStyle="{StaticResource CenterAlignedCell}" 
            Binding="{Binding EnterDate,StringFormat={}\{0:dd/MM/yyyy\}}" IsReadOnly="True"/> 

....

Tôi hy vọng điều này có hiệu quả đối với bất cứ ai lang thang làm thế nào để làm nổi bật một hàng đầy đủ trong WPF DataGrid.

+0

Đề xuất của bạn hoạt động nhưng tôi có một câu hỏi. Tôi đã xác định trình kích hoạt chung cho DataGridCell (ví dụ: đặt một nền khác nếu nó là chỉ đọc). Tuy nhiên, trình kích hoạt chung này dường như không hoạt động nếu tôi áp dụng kiểu RightAlignedCell của bạn mà không có trình kích hoạt. Thêm trình kích hoạt vào kiểu của bạn (như bạn đã làm ở đây) hoạt động tốt. Bạn có thể giải thích lý do tại sao? – newman

Các vấn đề liên quan