2008-12-19 116 views
5

我有一个数据网格,每行有一个按钮(下面显示了xaml)。我试图摆脱突出显示所选行的蓝色突出显示功能,以及鼠标悬停在其上的 行。我试图把它放好,所以你只需点击按钮,而不必获得行选择和鼠标悬停突出显示功能。我尝试将IsHitTestVisible设置为false,但随后该按钮不可点击。我怎样才能做到这一点?如何在Silverlight数据网格中删除鼠标悬停突出显示和选定的行突出显示

<data:DataGrid x:Name="grdClinics" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Bottom" 
       AutoGenerateColumns="False" 
       HeadersVisibility="None" 
       RowHeight="55" 
       Background="Transparent" 
       AlternatingRowBackground="Transparent" 
       RowBackground="Transparent" 
       BorderBrush="Transparent" 
       Foreground="Transparent" 
       GridLinesVisibility="None" 
       SelectionMode="Single">       

    <data:DataGrid.Columns> 
     <data:DataGridTemplateColumn Header="Clinic"> 
      <data:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Button x:Name="btnClinic" 
          Height="46" 
          Width="580" 
          Content="{Binding Path=Description}" 
          Style="{StaticResource ShinyButton}" 
          Click="btnClinic_OnClick" 
          FontSize="24" 
          FontFamily="Tahoma" 
          FontWeight="Bold"> 
         <Button.Background> 
          <LinearGradientBrush EndPoint="0.528,1.144" StartPoint="1.066,1.221"> 
           <GradientStop Color="#FF000000"/> 
           <GradientStop Color="#FFEDC88F" Offset="1"/> 
          </LinearGradientBrush> 
         </Button.Background> 
        </Button> 
       </DataTemplate> 
      </data:DataGridTemplateColumn.CellTemplate> 
     </data:DataGridTemplateColumn> 
    </data:DataGrid.Columns> 
</data:DataGrid> 

回答

5

简短的答案是使用样式。长答案如下:

在Silverlight 2.0数据网格中有两种样式属性可以解决您的问题。第一个是CellStyle,第二个是RowStyle。 CellStyle属性是将删除当前选定单元格周围淡蓝色突出显示的属性。 RowStyle属性是您将能够删除指示所选行的淡蓝色阴影的属性。我使用的CellStyle如下:

<Style x:Key="CellStyle" TargetType="local:DataGridCell"> 
     <Setter Property="Background" Value="Transparent" /> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     <Setter Property="VerticalContentAlignment" Value="Stretch" /> 
     <Setter Property="Cursor" Value="Arrow" /> 
     <Setter Property="IsTabStop" Value="False" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:DataGridCell"> 
        <Grid Name="Root" Background="Transparent"> 
         <vsm:VisualStateManager.VisualStateGroups> 
          <vsm:VisualStateGroup x:Name="CurrentStates" > 
           <vsm:VisualStateGroup.Transitions> 
            <vsm:VisualTransition GeneratedDuration="0" /> 
           </vsm:VisualStateGroup.Transitions> 

           <vsm:VisualState x:Name="Regular" /> 
           <vsm:VisualState x:Name="Current" /> 
            <!--<Storyboard> 
             <DoubleAnimation Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="Opacity" To="1" Duration="0" /> 
            </Storyboard> 
           </vsm:VisualState>--> 
          </vsm:VisualStateGroup> 
         </vsm:VisualStateManager.VisualStateGroups> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*" /> 
          <ColumnDefinition Width="Auto" /> 
         </Grid.ColumnDefinitions> 
         <Rectangle Name="FocusVisual" Stroke="#FF6DBDD1" StrokeThickness="1" Fill="#66FFFFFF" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsHitTestVisible="false" Opacity="0" /> 
         <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="{TemplateBinding Padding}" /> 
         <Rectangle Name="RightGridLine" Grid.Column="1" VerticalAlignment="Stretch" Width="1" /> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

如果你会发现,我注释掉改变了FocusVisual矩形的不透明度值故事板。这是做的是设置FocusVisual矩形显示在单元格选择。 (请注意:为CellPresenter期待这个元素,并没有找到该元素将导致错误无法删除的FocusVisual元。)

我使用的RowStyle如下:

<Style TargetType="local:DataGridRow" x:Key="MyCustomRow"> 
     <Setter Property="IsTabStop" Value="False" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:DataGridRow"> 
        <localprimitives:DataGridFrozenGrid x:Name="Root"> 
         <localprimitives:DataGridFrozenGrid.Resources> 
          <Storyboard x:Key="DetailsVisibleTransition" > 
           <DoubleAnimation Storyboard.TargetName="DetailsPresenter" Storyboard.TargetProperty="ContentHeight" Duration="00:00:0.1" /> 
          </Storyboard> 
         </localprimitives:DataGridFrozenGrid.Resources> 
         <vsm:VisualStateManager.VisualStateGroups> 
          <vsm:VisualStateGroup x:Name="CommonStates" > 
           <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="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
            </Storyboard> 
           </vsm:VisualState>--> 
           <vsm:VisualState x:Name="MouseOver Selected"/> 
           <!--<Storyboard> 
             <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
            </Storyboard> 
           </vsm:VisualState>--> 
           <vsm:VisualState x:Name="Unfocused Selected"/> 
           <!--<Storyboard> 
             <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
             <ColorAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> 
              <SplineColorKeyFrame KeyTime="0" Value="#FFE1E7EC" /> 
             </ColorAnimationUsingKeyFrames> 
            </Storyboard> 
           </vsm:VisualState>--> 
          </vsm:VisualStateGroup> 
         </vsm:VisualStateManager.VisualStateGroups> 
         <localprimitives:DataGridFrozenGrid.RowDefinitions> 
          <RowDefinition Height="*" /> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition Height="Auto" /> 
         </localprimitives:DataGridFrozenGrid.RowDefinitions> 
         <localprimitives:DataGridFrozenGrid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto" /> 
          <ColumnDefinition Width="*" /> 
         </localprimitives:DataGridFrozenGrid.ColumnDefinitions> 
         <Rectangle x:Name="BackgroundRectangle" Grid.RowSpan="2" Grid.ColumnSpan="2" Opacity="0" Fill="#FFBADDE9" /> 
         <localprimitives:DataGridRowHeader Grid.RowSpan="3" x:Name="RowHeader" localprimitives:DataGridFrozenGrid.IsFrozen="True" /> 

         <localprimitives:DataGridCellsPresenter x:Name="CellsPresenter" localprimitives:DataGridFrozenGrid.IsFrozen="True"/> 

         <localprimitives:DataGridDetailsPresenter Grid.Row="1" Grid.Column="1" x:Name="DetailsPresenter" /> 
         <Rectangle Grid.Row="2" Grid.Column="1" x:Name="BottomGridLine" HorizontalAlignment="Stretch" Height="1" /> 
        </localprimitives:DataGridFrozenGrid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

正如你可以看到,我评论了一些更多的视觉状态。您需要注释掉MouseOver VisualState故事板,普通选择故事板,MouseOver选择故事板和未聚焦选定故事板。

(请注意:我没有删除这些视觉状态,我只是注释掉了他们用来做什么。)

这是我的全部代码,以供参考:(XAML,然后再VB)

XAML:

<UserControl x:Class="DataGrid_Mouseover.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    xmlns:local="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows" 
    xmlns:localprimitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data" 
    xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"> 
<UserControl.Resources> 

    <Style x:Key="CellStyle" TargetType="local:DataGridCell"> 

     <!-- TODO: Remove this workaround to force MouseLeftButtonDown event to be raised when root element is clicked. --> 
     <Setter Property="Background" Value="Transparent" /> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     <Setter Property="VerticalContentAlignment" Value="Stretch" /> 
     <Setter Property="Cursor" Value="Arrow" /> 
     <Setter Property="IsTabStop" Value="False" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:DataGridCell"> 
        <Grid Name="Root" Background="Transparent"> 
         <vsm:VisualStateManager.VisualStateGroups> 
          <vsm:VisualStateGroup x:Name="CurrentStates" > 
           <vsm:VisualStateGroup.Transitions> 
            <vsm:VisualTransition GeneratedDuration="0" /> 
           </vsm:VisualStateGroup.Transitions> 

           <vsm:VisualState x:Name="Regular" /> 
           <vsm:VisualState x:Name="Current" /> 
            <!--<Storyboard> 
             <DoubleAnimation Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="Opacity" To="1" Duration="0" /> 
            </Storyboard> 
           </vsm:VisualState>--> 
          </vsm:VisualStateGroup> 
         </vsm:VisualStateManager.VisualStateGroups> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*" /> 
          <ColumnDefinition Width="Auto" /> 
         </Grid.ColumnDefinitions> 
         <!-- TODO Refactor this if SL ever gets a FocusVisualStyle on FrameworkElement --> 
         <Rectangle Name="FocusVisual" Stroke="#FF6DBDD1" StrokeThickness="1" Fill="#66FFFFFF" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsHitTestVisible="false" Opacity="0" /> 
         <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="{TemplateBinding Padding}" /> 
         <Rectangle Name="RightGridLine" Grid.Column="1" VerticalAlignment="Stretch" Width="1" /> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <Style TargetType="local:DataGridRow" x:Key="MyCustomRow"> 
     <Setter Property="IsTabStop" Value="False" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:DataGridRow"> 
        <localprimitives:DataGridFrozenGrid x:Name="Root"> 
         <localprimitives:DataGridFrozenGrid.Resources> 
          <Storyboard x:Key="DetailsVisibleTransition" > 
           <DoubleAnimation Storyboard.TargetName="DetailsPresenter" Storyboard.TargetProperty="ContentHeight" Duration="00:00:0.1" /> 
          </Storyboard> 
         </localprimitives:DataGridFrozenGrid.Resources> 
         <vsm:VisualStateManager.VisualStateGroups> 
          <vsm:VisualStateGroup x:Name="CommonStates" > 
           <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="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
            </Storyboard> 
           </vsm:VisualState>--> 
           <vsm:VisualState x:Name="MouseOver Selected"/> 
           <!--<Storyboard> 
             <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
            </Storyboard> 
           </vsm:VisualState>--> 
           <vsm:VisualState x:Name="Unfocused Selected"/> 
           <!--<Storyboard> 
             <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1" /> 
             <ColorAnimationUsingKeyFrames BeginTime="0" Duration="0" Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> 
              <SplineColorKeyFrame KeyTime="0" Value="#FFE1E7EC" /> 
             </ColorAnimationUsingKeyFrames> 
            </Storyboard> 
           </vsm:VisualState>--> 
          </vsm:VisualStateGroup> 
         </vsm:VisualStateManager.VisualStateGroups> 
         <localprimitives:DataGridFrozenGrid.RowDefinitions> 
          <RowDefinition Height="*" /> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition Height="Auto" /> 
         </localprimitives:DataGridFrozenGrid.RowDefinitions> 
         <localprimitives:DataGridFrozenGrid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto" /> 
          <ColumnDefinition Width="*" /> 
         </localprimitives:DataGridFrozenGrid.ColumnDefinitions> 
         <Rectangle x:Name="BackgroundRectangle" Grid.RowSpan="2" Grid.ColumnSpan="2" Opacity="0" Fill="#FFBADDE9" /> 
         <localprimitives:DataGridRowHeader Grid.RowSpan="3" x:Name="RowHeader" localprimitives:DataGridFrozenGrid.IsFrozen="True" /> 

         <localprimitives:DataGridCellsPresenter x:Name="CellsPresenter" localprimitives:DataGridFrozenGrid.IsFrozen="True"/> 

         <localprimitives:DataGridDetailsPresenter Grid.Row="1" Grid.Column="1" x:Name="DetailsPresenter" /> 
         <Rectangle Grid.Row="2" Grid.Column="1" x:Name="BottomGridLine" HorizontalAlignment="Stretch" Height="1" /> 
        </localprimitives:DataGridFrozenGrid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <local:DataGrid x:Name="TestGrid" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Bottom" 
      AutoGenerateColumns="False" 
      HeadersVisibility="None" 
      RowHeight="55" 
      Background="Transparent" 
      AlternatingRowBackground="Transparent" 
      RowBackground="Transparent" 
      BorderBrush="Transparent" 
      Foreground="Transparent" 
      GridLinesVisibility="None" 
      SelectionMode="Single" 
      CellStyle="{StaticResource CellStyle}" 
      RowStyle="{StaticResource MyCustomRow}"> 

     <local:DataGrid.Columns> 
      <local:DataGridTemplateColumn Header="Clinic"> 
       <local:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Button x:Name="btnClinic" 
         Height="46" 
         Width="580" 
         Content="{Binding Path=Description}" 
         Click="btnClinic_Click" 
         FontSize="24" 
         FontFamily="Tahoma" 
         FontWeight="Bold"> 
          <Button.Background> 
           <LinearGradientBrush EndPoint="0.528,1.144" StartPoint="1.066,1.221"> 
            <GradientStop Color="#FF000000"/> 
            <GradientStop Color="#FFEDC88F" Offset="1"/> 
           </LinearGradientBrush> 
          </Button.Background> 
         </Button> 
        </DataTemplate> 
       </local:DataGridTemplateColumn.CellTemplate> 
      </local:DataGridTemplateColumn> 
     </local:DataGrid.Columns> 
    </local:DataGrid> 
</Grid> 
</UserControl> 

VB:

Partial Public Class Page 
Inherits UserControl 

Public Sub New() 
    InitializeComponent() 
    Dim test As IList(Of String) = New List(Of String) 
    test.Add("test1") 
    test.Add("test1") 
    test.Add("test1") 
    test.Add("test1") 
    test.Add("test1") 
    test.Add("test1") 
    test.Add("test1") 
    test.Add("test1") 
    test.Add("test1") 
    test.Add("test1") 

    TestGrid.ItemsSource = test 

End Sub 

Private Sub btnClinic_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 

End Sub 
End Class 

希望这有助于。

谢谢, 斯科特

+0

啊天才!谢谢。我不知道解决方案会需要这么多xaml。 – Jeremy 2009-01-28 22:42:06

相关问题