it-swarm-id.com

Bagaimana cara mendapatkan sel DataGrid WPF untuk benar menyelaraskan tanpa membuat area yang dipilih pada baris baru kecil?

Saya menggunakan WPF4.0 DataGrid. Ketika mengklik dua kali pada sel di baris baru semuanya berfungsi dengan baik kecuali Saya telah menambahkan gaya sel ke kolom itu. Sebagai contoh, saya memiliki kolom numerik di mana saya ingin data disejajarkan dengan benar sehingga xaml terlihat seperti ini

<DataGridTextColumn Binding="{Binding Path=ImpaId}"
                    CellStyle="{StaticResource CellRightAlign}">
     <DataGridTextColumn.Header>
          <TextBlock  Style="{StaticResource DataGridHeader}">Impa</TextBlock>
     </DataGridTextColumn.Header>
</DataGridTextColumn>

Di mana gaya dalam sumber daya bersama hanya:

<Style x:Key="CellRightAlign">
    <Setter Property="Control.HorizontalAlignment"
            Value="Right" />
</Style>

Daerah yang dapat dipilih yang dihasilkan pada baris baru ditunjukkan pada gambar sebagai area biru kecil itu. Ini adalah target yang sangat kecil bagi pengguna untuk menekan, dan ini merupakan kolom yang paling mungkin mereka ingin mulai dengan pada baris baru .

DataGrid cell with tiny width

Jika saya menghapus CellStyle, area berfungsi seperti yang diinginkan tetapi tentu saja saya kehilangan perataan yang benar.

DataGrid cell with proper width

Adakah yang tahu bagaimana mencapai keduanya?

Hal yang saya coba

  1. Menetapkan TargetNullValue pada pengikatan ke format dengan lebar. Ini berfungsi pada baris yang ada tetapi tidak berpengaruh pada baris baru.
  2. Pengaturan MinWidth pada kolom, ini tidak mempengaruhi lebar area yang dipilih baris baru.

Hal yang berhasil:

Menggunakan informasi dari jawaban oleh @AngelWPF saya dapat mengubah dari menggunakan CellStyle untuk menggunakan ElementStyle sebagai berikut:

<DataGridTextColumn Binding="{Binding Path=ImpaId}"
                    CellStyle="{StaticResource CellRightAlign}">

Menjadi

<DataGridTextColumn Binding="{Binding Path=ImpaId}"
                    ElementStyle="{StaticResource CellRightAlign}">
57
Tod

Anda dapat menerapkan ElementStyle pada DataGridTextColumn yang ditargetkan ke TextBlock dan meluruskannya, itu akan berhasil.

      <DataGridTextColumn Binding="{Binding Path=ImpaId}">
          <DataGridTextColumn.Header>
               <TextBlock  Style="{StaticResource
                                  DataGridHeader}">
                    Impa
               </TextBlock>
          </DataGridTextColumn.Header>
          <DataGridTextColumn.ElementStyle>
              <Style TargetType="{x:Type TextBlock}">
                  <Setter Property="HorizontalAlignment" Value="Right" />
              </Style>
          </DataGridTextColumn.ElementStyle>
      </DataGridTextColumn> 
82
WPF-it

Hanya ingin menambahkan lebih banyak contoh untuk pencarian kode di masa depan.

Saya meletakkan ini di bagian atas file xaml:

<UserControl.Resources>
    <Style TargetType="{x:Type TextBlock}" x:Key="RightCell">
        <Setter Property="Background" Value="{Binding Included, Converter={StaticResource BoolToColorConverter}}"/>
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="TextAlignment" Value="Right"/>
    </Style>
</UserControl.Resources>

Dan kemudian di datagrid:

<DataGridTextColumn Header="Excluded" Binding="{Binding Excluded}" ElementStyle="{StaticResource RightCell}"/>

Hak ini menyelaraskan teks dan penyortiran masih diaktifkan. Kotak teks mengisi sel dan dalam hal ini diwarnai menggunakan bool converter.

14
Rahbek

Saya hanya punya masalah serupa dan menemukan solusi lain dengan menimpa Style untuk DataGridCell di Blend.

Item yang diubah dari gaya asli adalah setter untuk VerticalAlignment dan VerticalContentAlignment dalam Style itu sendiri untuk meregangkan sel itu sendiri dan VerticalAlignment="Center" dan HorizontalAlignment="Right" di properti Templat untuk menyelaraskan konten. Ubah nilai-nilai ini menjadi apa pun yang Anda butuhkan untuk menyelaraskan konten sel.

Sisa style bisa dihapus sehingga pengaturan dari style dasar akan digunakan (menggunakan StaticResource, style is BasedOn). Namun aku meninggalkan gayanya saat Blend memproduksinya.

XAML-Code yang dihasilkan ini kemudian harus dimasukkan ke dalam sumber daya kontrol:

<Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource ResourceKey={x:Type DataGridCell}}">
    <Setter Property="VerticalAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />

    <!-- Additional styles, can be removed to fall back to base styles -->
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                    <ContentPresenter
                        ContentTemplate="{TemplateBinding ContentTemplate}"
                        Content="{TemplateBinding Content}"
                        ContentStringFormat="{TemplateBinding ContentStringFormat}"
                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Right"
                        />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
            <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
        </Trigger>
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Setter Property="BorderBrush" Value="{DynamicResource {ComponentResourceKey ResourceId=FocusBorderBrushKey, TypeInTargetAssembly={x:Type DataGrid}}}"/>
        </Trigger>
    </Style.Triggers>
</Style>
5
mattanja

Anda dapat mencoba mengatasinya:

           <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                        <TextBlock HorizontalAlignment="Right" Text="{Binding Path=ImpaId}"/>
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
5
MichaelS