2010-09-01 35 views
11

uydurulmuş DataGridRow Arka plan Color Bir AlternatingRowBackground fırçası olan bir WPF veri vardır. Diğer her satırı renklendirmek için yapılandırıldı. Şu andaki satırı vurgulayan fare üzerinde bir şey yapmak isterim. Ancak, Stil Tetikleyici AlternatingRowBackground fırçasına kaybediyor gibi görünüyor. Fare üzerinde istenen satır renklendirmesini alıyorum ... ama sadece AlternatingRowBackground fırçasıyla boyanmamış satırlarda. İşte WPF Stil Tetik AlternatingRowBackground Fırça

Windows.Resources içinde Style:

<Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="/Skins/MainSkin.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
      <Style TargetType="{x:Type DataGridRow}"> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" 
          Value="True"> 
         <Setter Property="Background" 
           Value="Red" /> 
         <Setter Property="FontWeight" 
           Value="ExtraBold" /> 
         <Setter Property="Height" 
           Value="20" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </ResourceDictionary> 
    </Window.Resources> 

Ve burada DataGrid:

<DataGrid Margin="25,15,25,0" 
       VerticalAlignment="Top" 
       ItemsSource="{Binding DocumentTypeList}" 
       AutoGenerateColumns="False" 
       Height="500" 
       AlternationCount="2" 
       FrozenColumnCount="2" 
       AlternatingRowBackground="{DynamicResource AlternatingRow}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Abbreviation}" 
           Header="Abbreviation" /> 
      <DataGridTextColumn Binding="{Binding Title}" 
           Header="Title" /> 

      <DataGridTextColumn Binding="{Binding Fee}" 
           Header="Fee" /> 
      <DataGridTextColumn Binding="{Binding SpecialInstructions}" 
           Header="Special Instructions" /> 
     </DataGrid.Columns> 
    </DataGrid> 

mutlak galip ilan için bir yol var mı? Sorun bir hiyerarşi mi? Bana öyle geliyor ki, AlternatingRowBackground fırçası, beyanın en spesifik kısmı ile doğrudan ilişkili olduğu için kazanıyor. Güncelleme

:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/Skins/MainSkin.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <Style TargetType="{x:Type DataGridRow}"> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" 
         Value="True"> 
        <Setter Property="Background" 
          Value="Red" /> 
        <Setter Property="FontWeight" 
          Value="ExtraBold" /> 
        <Setter Property="Height" 
          Value="20" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
     <Style TargetType="{x:Type DataGrid}"> 
      <Setter Property="AlternatingRowBackground" Value="{DynamicResource AlternatingRow}"/> 
     </Style> 
    </ResourceDictionary> 
</Window.Resources> 

Ve DataGrid (eksi AlternatingRowBackground fırça): Burada @ dayanarak Val'ın rehberlik doğru sözdizimi

benim için çalıştı neler
<DataGrid Margin="25,15,25,0" 
       VerticalAlignment="Top" 
       ItemsSource="{Binding DocumentTypeList}" 
       AutoGenerateColumns="False" 
       Height="500" 
       AlternationCount="2" 
       FrozenColumnCount="2"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Abbreviation}" 
           Header="Abbreviation" /> 
      <DataGridTextColumn Binding="{Binding Title}" 
           Header="Title" /> 

      <DataGridTextColumn Binding="{Binding Fee}" 
           Header="Fee" /> 
      <DataGridTextColumn Binding="{Binding SpecialInstructions}" 
           Header="Special Instructions" /> 
     </DataGrid.Columns> 
    </DataGrid> 

cevap

5

<Style TargetType="{x:Type DataGridRow}"> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" 
       Value="True"> 
      <Setter Property="Background" 
        Value="Red" /> 
      <Setter Property="FontWeight" 
        Value="ExtraBold" /> 
      <Setter Property="Height" 
        Value="20" /> 
     </Trigger> 
    </Style.Triggers> 
    <Setter Property="AlternatingRowBackground" 
      Value="{DynamicResource AlternatingRow}"/> 
</Style> 
: bu tür şeyleri ile geçmiş, tetikleyiciler örneğin dışında bir ayarlayıcı kullanmaktır

Ve bunların özelliği, DataGrid'un kendisinde bulunan bağlayıcıyı kaldırır. Her ne kadar genellikle bunu veri tetikleyicileriyle yapıyorum ve genellikle dinamik kaynak bağlamaları ile yapmıyorum. Ama yine de değer olabilir bir atış var bunu yapmak için iki yol var, ne özellikle açıktır

+0

kesinlikle bana doğru yönde gidiyor. Setter özelliğini size önerdiğiniz gibi ekledim ... {x: Type DataGridRow} 'a değil, {x: Type DataGrid} için ayrı bir stil olarak. Bu hile yapar. –

+0

Teşekkür ederiz! DataGrid.AlternatingRowBackground yerine bir DataGrid Stilinde AlternatingRowBackground öğesini neden tanımladığınızı, doğrudan tetikleyicinin çalışmasına izin verdiğinden emin değilim, ancak bunu yaptığına sevindim! –

18

. DataGridRow (kodda) ana DataGrid öğesinden arka plan özelliğini satırdaki yerel bir değere aktardığından, belirttiğiniz gibi tetikleyiciniz tarafından ayarlanan değerin önüne geçecektir.

ilk (ve en basit) yolu AlternatingRowBackground veya RowBackground kullanmak yerine Val önerildiği gibi arka plan rengini değiştirmek üzere tetikler kullanmak getirmemektir. Onun örneği tam olarak değil ve olduğu gibi çalışmayacak. Doğru stil ve kullanım aşağıdaki gibi olacaktır. DataGrid üzerinde AlternationCount'u ayarlamanız gerektiğini veya satırların hiçbir zaman alternatif indeksler almayacağını unutmayın.

<DataGrid AlternationCount="2"> 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Setter Property="Background" Value="White"/> 
      <Setter Property="FontWeight" Value="Normal"/> 
      <Style.Triggers> 
       <Trigger Property="AlternationIndex" Value="1"> 
        <Setter Property="Background" Value="Wheat"/> 
        <Setter Property="FontWeight" Value="Bold"/> 
       </Trigger> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="Khaki"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 

İkinci seçenek VisualStateManager'ı kullanmaktır. Bu size farklı görsel durumlar üzerinde çok daha fazla kontrol sağlar, ancak daha ayrıntılıdır. Neyse ki, Blend'i kullanarak varsayılan kontrol şablonunu kopyalamak oldukça kolaydır. MouseOver durumunda Storyboard dışında aşağıdakilerin çoğu değişmez ve ben selectiveScrollingGrid üzerinde bir arka plan belirledim.

sarma için üzgünüm

, ama dediğim gibi, biraz daha ayrıntılı var.

<DataGrid AlternationCount="2" AlternatingRowBackground="Wheat"> 
    <DataGrid.RowStyle> 
    <Style TargetType="DataGridRow"> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="DataGridRow"> 
      <Border x:Name="DGR_Border" 
        Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        SnapsToDevicePixels="True"> 
       <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup x:Name="CommonStates"> 
        <VisualState x:Name="Normal"/> 
        <VisualState x:Name="Normal_AlternatingRow"/> 
        <VisualState x:Name="Unfocused_Editing"/> 
        <VisualState x:Name="Normal_Editing"/> 
        <VisualState x:Name="Unfocused_Selected"/> 
        <VisualState x:Name="Normal_Selected"/> 
        <VisualState x:Name="MouseOver_Unfocused_Editing"/> 
        <VisualState x:Name="MouseOver_Editing"/> 
        <VisualState x:Name="MouseOver_Unfocused_Selected"/> 
        <VisualState x:Name="MouseOver_Selected"/> 
        <VisualState x:Name="MouseOver"> 
        <Storyboard Storyboard.TargetName="Highlight"> 
         <ColorAnimation Duration="0" Storyboard.TargetProperty="Color" To="Khaki"/> 
        </Storyboard> 
        </VisualState> 
       </VisualStateGroup> 
       </VisualStateManager.VisualStateGroups> 
       <SelectiveScrollingGrid x:Name="selectiveScrollingGrid"> 
       <SelectiveScrollingGrid.Background> 
        <SolidColorBrush x:Name="Highlight" Color="Transparent"/> 
       </SelectiveScrollingGrid.Background> 
       <SelectiveScrollingGrid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="*"/> 
       </SelectiveScrollingGrid.ColumnDefinitions> 
       <SelectiveScrollingGrid.RowDefinitions> 
        <RowDefinition Height="*"/> 
        <RowDefinition Height="Auto"/> 
       </SelectiveScrollingGrid.RowDefinitions> 
       <DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       <DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/> 
       <DataGridRowHeader Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/> 
       </SelectiveScrollingGrid> 
      </Border> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 
+0

Teşekkürler Josh.Tanımladığın ilk seçeneği gerçekten çok beğendim. Kabul edilen cevabı bölmek isterdim. –

+0

LOL gerçekten önemli değil ama kabul edilen cevap en azından derlenmemeli mi? :) – Josh

+1

Ha ha! Muhtemelen öylesine ... ama zalim, 17.3k'ya karşı 16 itibarı olan birinden bir cevap alarak ... :) –