2016-04-11 4 views
0

Я использую WPat datagrid для отображения данных. Я пытаюсь понять, как выделить всю строку при щелчке элемента, включая пустые столбцы/пробелы на конце, если в конце есть пустое место (я использую динамически созданные столбцы). Заметьте, я НЕ пытаюсь выделить только определенную ячейку. Это http://imgur.com/7Xjoj2H - это то, что я вижу. Неиспользуемое пространство в конце строки - это пространство, в котором в настоящее время нет столбца, и не подсвечивается. Я хотел бы, чтобы это пространство было выделено также при щелчке по строке. Я пробовал:WPF DataGrid выделить целую строку

Установка ширины в последний столбец авто, чтобы заполнить оставшееся пространство. Это не работает для меня, потому что это отключает горизонтальную полосу прокрутки, которая мне нужна, так как я использую динамически созданные столбцы.

Я также попытался добавить стиль для DataGridRows:

<Trigger Property="IsSelected" 
       Value="true"> 
      <Setter Property="Background" 
        Value="{StaticResource SelectedBrush}" /> 
     </Trigger> 

Этот вид работ, хотя, когда DataGrid нагрузки, или когда моя программа не в фокусе, это выглядит следующим образом: http://imgur.com/EtTmBbH где подсвечивается только последняя область неиспользуемого пространства.

Если возможно, я бы предпочел не обходить это, просто добавив пустой фиктивный столбец в конец, потому что это приводит к тем же проблемам, что и установка последней ширины столбца для автоматического выше.

Любые предложения?

Edit:

Вот код для стиля DataGridRow:

<Style TargetType="{x:Type DataGridRow}" 
     x:Key="DataGridRowStyle"> 

    <Setter Property="Background" 
      Value="White" /> 

    <Style.Triggers> 
     <Trigger Property="AlternationIndex" 
       Value="1"> 
      <Setter Property="Background" 
        Value="#efefef" /> 
     </Trigger> 

     <Trigger Property="IsMouseOver" 
       Value="true"> 
      <Setter Property="Background" 
        Value="{StaticResource RolloverBrush}" /> 
     </Trigger> 
     <Trigger Property="IsSelected" 
       Value="true"> 
      <Setter Property="Background" 
        Value="{StaticResource SelectedBrush}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

И выбранная щетка:

<LinearGradientBrush x:Key="SelectedBrush" 
        StartPoint="0,0" 
        EndPoint="0,1"> 
    <GradientStop Offset="0" 
        Color="#3399FF" /> 
</LinearGradientBrush> 

Код для DataGrid:

 <DataGrid x:Name="JobListView" 
       AutoGenerateColumns="False" 
       ItemsSource="{Binding UnitStatusCollection, Mode=TwoWay}" 
       CanUserDeleteRows="False" 
       Style="{StaticResource JobGridViewStyle}" 
       SelectedIndex="{Binding JobsListViewSelectedIndex, Mode=TwoWay}" 
       SelectedItem="{Binding JobsListViewSelectedUnitStatusPair}" 
       Utility:DataGridColumnsBehavior.BindableColumns="{Binding DataGridColumns}" 
       ContextMenu="{StaticResource ListViewContextMenu}" 
       Margin="10,0" 
       Grid.Row="1" 
       HorizontalAlignment="Stretch" 
       HorizontalContentAlignment="Stretch" 
       RowStyle="{StaticResource DataGridRowStyle}" 
       AlternationCount="2" 
       HorizontalGridLinesBrush="#5A5A5F" 
       VerticalGridLinesBrush="#5A5A5F"> 
+0

Можете ли вы показать тег 'Style' для« DataGridRows »? –

+0

Отредактировано сообщение, чтобы показать его – KSF

+0

Как вы применяете его к сетке? Ваш код работает для меня с помощью 'RowStyle =" {StaticResource DataGridRowStyle} "' в DataGrid. –

ответ

1

Вы, ма у ясно выделить цвет по умолчанию, так что ваш SelectedBrush будет использоваться вместо:

<DataGrid ...> 
     <DataGrid.Resources> 
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00000000"/> 
      <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="#00000000"/> 
     </DataGrid.Resources> 
    </DataGrid> 
+0

Я пробовал это, я установил цвет оранжевым. Теперь, когда я выделяю строку, она выглядит так: http://imgur.com/HQH8wvj (я назначил цвет SolidColorBrush оранжевым). Синий находится там, потому что моя выбранная кисть рисует этот цвет. Я не могу понять, почему/как столбцы обрабатываются по-разному, чем пустое пространство на конце в отношении поведения краски в строке. – KSF

+0

Кажется, DataGrid использует SystemColors.HighlightBrushKey, чтобы выделить часть строки, занятую существующими столбцами. Я предложил бы сделать HighlightBrushKey прозрачным, а не оранжевым, а затем изменить ваш SelectedBrush на любой цвет, который вы хотите. –

+1

Кроме того, строка в DataGrid состоит из двух частей, одна из которых занята ячейками, а вторая - нет. Вы можете установить CellStyle также с тем же SelectedBrush. В этом случае ячейки будут выделены нужным цветом. –

2

Для того, чтобы сделать эту работу, я использовал предложение Антона:

Кроме того, строка в DataGrid состоит из 2-х частей , один из них занят ячейками, а второй - нет. Вы можете установить CellStyle также с тем же SelectedBrush. В этом случае ячейки будут выделены нужным цветом.

То, что я сделал, сделать стиль для DataGridCellStyle и сделал триггер для IsSelected:

<Style x:Key="DataGridCellStyle" 
     TargetType="{x:Type DataGridCell}"> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" 
       Value="True"> 
      <Setter Property="Background" 
        Value="{StaticResource SelectedBrush}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Какие краски на фоне клеток того же цвета в качестве фона выбранной строки. Это в дополнение к тому:

<Style TargetType="{x:Type DataGridRow}" 
     x:Key="DataGridRowStyle"> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" 
       Value="true"> 
      <Setter Property="Background" 
        Value="{StaticResource SelectedBrush}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Это позволяет окрашенная цвет проходить по всей строки при загрузке или когда программа теряет фокус.

1

я нашел другое решение, что на самом деле немного проще:

<DataGrid.Resources> 
    <!-- Select everything with orange... --> 
    <SolidColorBrush 
     Color="#ff9933" 
     x:Key="{x:Static SystemColors.HighlightBrushKey}" /> 
    <!-- ...all the time --> 
    <SolidColorBrush 
     Color="#ff9933" 
     x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" /> 
</DataGrid.Resources> 

Проблема заключалась в том, что вся строка была выделена, но когда фокус был потерян, то «невыбранные» клетки были выделены в другой цвет: Неактивный выбор выделяет цвет.

Фон мертвой зоны в конце строки устанавливается вашим триггером IsSelected=True. Избавьтесь от этого, и мертвая зона вообще не будет «выбирать». Используйте три разных цвета для этого: HighlightBrushKey и InactiveSelectionHighlightBrushKey, и все становится ясно.

Антон Данилов был очень, очень близко. Но ответ заключается не в том, чтобы сделать эти кисти прозрачными, а в том, чтобы сделать их такими, какие вы хотите.

Смежные вопросы