2016-04-18 28 views
0

Ich arbeite mit einem WPF DataGrid. Ich versuche, den Inhalt meiner DataGridTextColumns zu erhalten, um den angezeigten Text vertikal zu zentrieren.WPF DataGrid Text vertikale Ausrichtung

Momentan sehen meine Zellenwerte wie folgt aus: http://imgur.com/nkbE7Wt. Wie Sie sehen können, sind sie vertikal zur Oberseite der Zellen ausgerichtet.

Ich habe versucht, eine Vorlage zum Stil meiner DataGridCells, das funktioniert, und es zentriert den Text wie folgt: http://imgur.com/TCo6RCa. Der Stil für den DataGridCells ist wie folgt:

<Style x:Key="DataGridCellStyle" TargetType="{x:Type DataGridCell}"> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="{StaticResource SelectedBrush}" /> 
      <Setter Property="TextElement.Foreground" Value="#111111" /> 
     </Trigger>   
    </Style.Triggers> 
    <Setter Property="Background" Value="Transparent" /> 
    <Setter Property="TextElement.Foreground" Value="#666666" /> 
    <Setter Property="BorderBrush" Value="Transparent" /> 
    <Setter Property="BorderThickness" Value="1" /> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Border Background="Transparent" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="0" 
         SnapsToDevicePixels="True" 
         Padding="5" 
         VerticalAlignment="Center"> 
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Diese zusätzliche Vorlage tut im Grunde genau das, was ich will in Bezug darauf, wie sie angezeigt werden sollen. Es gibt jedoch ein Problem. Wenn der Benutzer auf eine Zelle klickt, um die Zeile zu markieren, muss er innerhalb des im Stil festgelegten Rahmens klicken, damit das DataGrid die Zeile tatsächlich hervorhebt.

Mit Snoop kann ich sehen, dass es die Grenze ist, die das Problem verursacht. Dies ist: http://imgur.com/9pD0W5C ist, was Snoop als Grenze zeigt, und wenn meine Maus nicht auf oder in der rot markierten Zeile ist, wenn sie angeklickt wird, wird die Zeile nicht ausgewählt/hervorgehoben.

Gibt es eine Möglichkeit, meine Vorlage so zu ändern, dass die Zeile markiert wird, wenn auf einen Teil der Zelle geklickt wird und nicht nur innerhalb des Rahmens?

Oder gibt es alternativ eine einfache Möglichkeit, den Text in meinen Zellen vertikal zu zentrieren?

Ich habe bereits versucht, TextElement.VerticalAlignment in meinem Stil zu setzen, aber dies verursacht, dass einige zusätzliche Zeilen innerhalb der Datagrid, die seltsam aussehen.

+1

hilft es, wenn Sie 'Vertical =„Center“' für Content und 'Vertical =„Stretch“' und 'Horizontal = gesetzt "Strecken" für Border? – ASh

+0

Das hat es geschafft! Vielen Dank. Wenn Sie das als Antwort erneut einreichen möchten, kann ich dies als Antwort markieren – KSF

Antwort

2

Border in Vorlage füllt nicht verfügbar Datagridcell-Raum, weil es zentriert ist (VerticalAlignment="Center")

wenn Sie VerticalAlignment="Center" nur für Content und VerticalAlignment="Stretch" und HorizontalAlignment="Stretch" für Border gesetzt, sollte es funktionieren.

es ist sogar eine bessere Ausrichtung in der Art zu konfigurieren (mit Stil)

<Setter Property="VerticalContentAlignment" Value="Center" /> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type DataGridCell}"> 
      <Border ...> 
       <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" ... /> 
      </Border> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter>