2008-12-19 119 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