2011-07-26 8 views
3

DataGridの特定の2つのカラムの間にビジュアルセパレータを作成する方法はありますか?それは空想的である必要はありません、おそらく二重線または太い国境です。DataGridカラムセパレータの作成

+0

を列の自動生成したり、コレクションを指定していますか? –

+0

私はすべてのオブジェクトをループし、コレクションにない列を追加して列を指定しています。これは、オブジェクトのすべてが定義されているわけではないにしても、すべての列をテーブルに入れることです。 – shader

+0

幸運。私がwpf DataGridを使って面白く何かをやろうとするたびに、私はそれを後悔しました。 –

答えて

3

はケースでは、あなたはカスタムスタイルを使用して達成することができ、この

enter image description here

のようなものですXAMLからリソースを取得してセパレータ列を作成することもできます。

DataGridTextColumn s1 = new DataGridTextColumn() { Header = "Start" }; 
DataGridTextColumn s2 = new DataGridTextColumn() { Header = "Start" }; 
DataGridTextColumn e1 = new DataGridTextColumn() { Header = "End" }; 
DataGridTextColumn e2 = new DataGridTextColumn() { Header = "End" }; 

DataGridTemplateColumn column = new DataGridTemplateColumn(); 
column.MinWidth = 0; 
column.Width = 2; 

var separatorStyle = (Style)FindResource("DataGridColumnSeparatorStyle"); 
column.CellStyle = separatorStyle; 

dataGrid.Columns.Add(s1); 
dataGrid.Columns.Add(e1); 
dataGrid.Columns.Add(column); 
dataGrid.Columns.Add(s2); 
dataGrid.Columns.Add(e2); 
+0

キーボードを使用してセルをナビゲートする際、セパレータ列はフォーカスを受け取ります。それは望ましくないことです... –

3

あなたには2つの選択肢があると思います。最も単純なオプションは、おそらくStyleを使用し、DataGrid.CellStyleを定義されたスタイルに設定することです。

<Style x:Key="DataGridBorder" TargetType="DataGridCell"> 
     <Setter Property="BorderBrush" Value="LightGray" /> 
     <Setter Property="BorderThickness" Value="1,1,1,1" />   
    </Style> 
    ... 
    <DataGrid CellStyle="{StaticResource DataGridBorder}"> 
    ... 

他の選択肢はDataGridTemplateColumnと一緒にCellTemplateを使用することです。

<DataGridTemplateColumn> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <Border BorderBrush="LightGray" BorderThickness="1,1,1,1" Margin="-6,-6,-6,-6"> 
        <Grid Margin="6,6,6,6"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*" />              
         </Grid.ColumnDefinitions> 
         <TextBlock Text="{Binding Whatever}" Grid.Column="0" TextTrimming="CharacterEllipsis" VerticalAlignment="Center" /> 
        </Grid>            
       </Border> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 

私はこれらのいずれもテストしていませんし、少し余裕を持って遊ぶ必要があるかもしれません。自動生成列または他のいずれかによって、あなたはコードビハインドの列を生成する場合

<Window.Resources> 
    <Style x:Key="DataGridColumnSeparatorStyle" TargetType="DataGridCell"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Rectangle VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Fill="Gray"/> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False">   
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Start"/> 
     <DataGridTextColumn Header="End"/> 
     <!-- Separator column --> 
     <DataGridTemplateColumn MinWidth="0" Width="2" CellStyle="{StaticResource DataGridColumnSeparatorStyle}"/> 
     <DataGridTextColumn Header="Start"/> 
     <DataGridTextColumn Header="End"/> 
    </DataGrid.Columns> 
</DataGrid> 

1

これを試してください。キーボードのTabキーを使用して、細胞内を移動する場合は、区切り文字列注力しません。

<DataGridTemplateColumn MinWidth="2" MaxWidth="2" IsReadOnly="True" CanUserResize="False"> 
    <DataGridTemplateColumn.HeaderStyle> 
     <Style TargetType="{x:Type DataGridColumnHeader}"> 
      <Setter Property="Background" Value="Gray" /> 
      <Setter Property="BorderBrush" Value="Gray" /> 
      <Setter Property="BorderThickness" Value="2" /> 
     </Style> 
    </DataGridTemplateColumn.HeaderStyle> 
    <DataGridTemplateColumn.CellStyle> 
     <Style TargetType="{x:Type DataGridCell}">      
      <Setter Property="BorderBrush" Value="Gray" /> 
      <Setter Property="BorderThickness" Value="2" />       
      <Setter Property="Focusable" Value="False" /> 
     </Style> 
    </DataGridTemplateColumn.CellStyle> 
</DataGridTemplateColumn> 

Source

関連する問題