2012-01-17 81 views
1

我一直在亂搞datagrid造型幾天,現在我有一個問題,我似乎無法解決。WPF DataGrid行前景鼠標懸停顏色

我想高亮我用鼠標懸停的那一行的文本。好吧,這似乎是一個簡單的任務,但同時我需要行背景和前景的自定義選擇顏色。這種組合似乎不可能解決。

如果我重寫datagridrow樣式,我可以得到除了行上的選擇樣式以外的所有東西。如果我也覆蓋datagridcell風格,我可以得到除了鼠標懸停前景全行高亮的所有內容。以下是我到目前爲止提出的完整造型。我知道它包含相同任務的重複屬性,但我一直在嘗試一切。只有完整的行鼠標懸停突出顯示缺失 - 只有懸停的單元格突出顯示。

你能幫我解決這個微小的細節嗎?

放在一個WPF窗口下面的代碼(我知道着色是可怕的,他們只是爲例子):

<Window.Resources> 
    <XmlDataProvider x:Key="persondata" 
        Source="datagrid.xml" 
        XPath="Data" /> 

    <!-- DataGrid --> 
    <Style x:Key="{x:Type DataGrid}" 
      TargetType="{x:Type DataGrid}"> 
     <Setter Property="AlternatingRowBackground" 
       Value="Orange" /> 
     <Setter Property="AlternationCount" 
       Value="2" /> 
     <Setter Property="Background" 
       Value="Green" /> 
     <Setter Property="BorderThickness" 
       Value="0" /> 
     <Setter Property="Foreground" 
       Value="Cyan" /> 
     <Setter Property="HeadersVisibility" 
       Value="Column" /> 
     <Setter Property="RowBackground" 
       Value="Yellow" /> 
    </Style> 

    <!-- Column header - remove header background --> 
    <Style x:Key="{x:Type DataGridColumnHeadersPresenter}" 
      TargetType="{x:Type DataGridColumnHeadersPresenter}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}"> 
        <ItemsPresenter /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <!-- Column header sort arrow --> 
    <Style x:Key="ColumnHeaderSortArrowStyle" 
      TargetType="{x:Type Path}"> 
     <Setter Property="Data" 
       Value="M0,0 L1,0 0.5,1 z" /> 
     <Setter Property="Fill"> 
      <Setter.Value> 
       <SolidColorBrush Color="Blue" /> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Height" 
       Value="6" /> 
     <Setter Property="Margin" 
       Value="0,0,8,0" /> 
     <Setter Property="RenderTransformOrigin" 
       Value="0.5,0.4" /> 
     <Setter Property="Stretch" 
       Value="Fill" /> 
     <Setter Property="VerticalAlignment" 
       Value="Center" /> 
     <Setter Property="Visibility" 
       Value="Collapsed" /> 
     <Setter Property="Width" 
       Value="8" /> 
    </Style> 

    <!-- Column header gripper --> 
    <Style x:Key="ColumnHeaderGripperStyle" 
      TargetType="{x:Type Thumb}"> 
     <Setter Property="Width" 
       Value="8" /> 
     <Setter Property="Background" 
       Value="Transparent" /> 
     <Setter Property="Cursor" 
       Value="SizeWE" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Thumb}"> 
        <Border Background="{TemplateBinding Background}" 
          Padding="{TemplateBinding Padding}" /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <!-- Column header --> 
    <Style x:Key="{x:Type DataGridColumnHeader}" 
      TargetType="{x:Type DataGridColumnHeader}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> 
        <Border BorderThickness="0,1,1,0" 
          Background="Black" 
          CornerRadius="5,5,0,0"> 
         <Border.BorderBrush> 
          <SolidColorBrush Color="Red" /> 
         </Border.BorderBrush> 

         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*" /> 
           <ColumnDefinition Width="Auto" /> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="Auto" /> 
          </Grid.RowDefinitions> 

          <Thumb x:Name="PART_LeftHeaderGripper" 
            Grid.Column="0" 
            Grid.Row="0" 
            HorizontalAlignment="Left" 
            Style="{StaticResource ColumnHeaderGripperStyle}" /> 

          <ContentPresenter Grid.Column="0" 
               Grid.Row="0" 
               Margin="6,3,6,3" 
               VerticalAlignment="Center" /> 

          <Path x:Name="SortArrow" 
            Grid.Column="1" 
            Grid.Row="0" 
            Style="{StaticResource ColumnHeaderSortArrowStyle}"> 
          </Path> 

          <Thumb x:Name="PART_RightHeaderGripper" 
            Grid.Column="1" 
            Grid.Row="0" 
            HorizontalAlignment="Right" 
            Style="{StaticResource ColumnHeaderGripperStyle}" /> 
         </Grid> 
        </Border> 

        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" 
           Value="True"> 
          <Setter TargetName="SortArrow" 
            Property="Fill"> 
           <Setter.Value> 
            <SolidColorBrush Color="Blue" /> 
           </Setter.Value> 
          </Setter> 
         </Trigger> 

         <Trigger Property="SortDirection" 
           Value="Ascending"> 
          <Setter TargetName="SortArrow" 
            Property="Visibility" 
            Value="Visible" /> 
          <Setter TargetName="SortArrow" 
            Property="RenderTransform"> 
           <Setter.Value> 
            <RotateTransform Angle="180" /> 
           </Setter.Value> 
          </Setter> 
         </Trigger> 

         <Trigger Property="SortDirection" 
           Value="Descending"> 
          <Setter TargetName="SortArrow" 
            Property="Visibility" 
            Value="Visible" /> 
         </Trigger> 

         <Trigger Property="DisplayIndex" 
           Value="0"> 
          <Setter Property="Visibility" 
            Value="Collapsed" 
            TargetName="PART_LeftHeaderGripper"></Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" 
        Value="True"> 
       <Setter Property="Foreground"> 
        <Setter.Value> 
         <SolidColorBrush Color="Blue" /> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

    <!-- Row --> 
    <Style x:Key="{x:Type DataGridRow}" 
      TargetType="{x:Type DataGridRow}"> 
     <Style.Triggers> 
      <Trigger Property="ItemsControl.AlternationIndex" 
        Value="0"> 
       <Setter Property="Background" 
         Value="Yellow" /> 
       <Setter Property="Foreground"> 
        <Setter.Value> 
         <SolidColorBrush Color="Black" /> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <Trigger Property="ItemsControl.AlternationIndex" 
        Value="1"> 
       <Setter Property="Background" 
         Value="Orange" /> 
       <Setter Property="Foreground"> 
        <Setter.Value> 
         <SolidColorBrush Color="Black" /> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <Trigger Property="IsMouseOver" 
        Value="true"> 
       <Setter Property="Foreground"> 
        <Setter.Value> 
         <SolidColorBrush Color="Magenta" /> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <Trigger Property="IsSelected" 
        Value="True"> 
       <Setter Property="Background" 
         Value="Brown" /> 
       <Setter Property="Foreground"> 
        <Setter.Value> 
         <SolidColorBrush Color="White" /> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

    <!-- Cell --> 
    <Style x:Key="{x:Type DataGridCell}" 
      TargetType="{x:Type DataGridCell}"> 
     <Setter Property="Foreground"> 
      <Setter.Value> 
       <SolidColorBrush Color="Black" /> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" 
        Value="true"> 
       <Setter Property="Foreground"> 
        <Setter.Value> 
         <SolidColorBrush Color="Magenta" /> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <Trigger Property="IsSelected" 
        Value="True"> 
       <Setter Property="Background" 
         Value="Brown" /> 
       <Setter Property="BorderBrush" 
         Value="Brown" /> 
       <Setter Property="Foreground"> 
        <Setter.Value> 
         <SolidColorBrush Color="White" /> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

<Grid> 
    <DataGrid AutoGenerateColumns="False" 
       ItemsSource="{Binding Source={StaticResource persondata}, XPath=Person}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="First Name" 
           Binding="{Binding [email protected]}" /> 
      <DataGridTextColumn Header="Last Name" 
           Binding="{Binding [email protected]}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

把下面的XML中的名爲「datagrid.xml」文件相同的解決方案:

<?xml version="1.0" encoding="utf-8" ?> 
<Data> 
    <Person Firstname="Fred" 
      Lastname="Flintstone"> 
    </Person> 
    <Person Firstname="Barney" 
      Lastname="Rubble"> 
    </Person> 
    <Person Firstname="Joe" 
      Lastname="Rockhead"> 
    </Person> 
</Data> 

謝謝...

+2

解決方案不屬於問題,將其作爲單獨答案發布並接受它。 – 2012-01-17 08:22:44

+0

是的,可能看起來很奇怪,但這就是我們在這裏做的。 – Will 2012-01-17 13:10:58

+0

我不能,因爲線程需要八個小時的時間,所以我只想提一提,我發現了這個錯誤,人們不必猜測答案。 – mfas 2012-01-18 08:43:38

回答

0

OK - 我最初的問題是,我用一個basestyle,這是所有其他款式繼承。這意味着諸如Foreground之類的樣式會通過樣式層次結構多次重寫。這種搞砸的事情足以使上述不可能。

我的解決方案是除去DataGrid本身(datagridrowheader,datagridrow,datagridcell)之外的所有數據網格樣式的BasedOn屬性。只在DataGrid上設置前景色,並且可以在行和單元格樣式中覆蓋它,而不會出現問題。

/mfas

+0

現在我不得不再等21個小時才能接受我自己的答案...... – mfas 2012-01-18 08:45:10