Как изменить цвет фона виджета ячейки WPF DataGrid в соответствии с цветом фона ячейки? - PullRequest
3 голосов
/ 24 августа 2010

Фон

Я использую VS2010, DataGrid (поставляемый с WPF) и вручную создаю строки и столбцы.Я устанавливаю различные цвета для рядов, в зависимости от их состояния (но для простоты, скажем, это был желтый).Это сработало, потому что datagrid использовал метки для отображения текста, и когда я установил фон для строки, он также отражается в виджете меток.

Однако я не мог ctrl + c (копировать) содержимое ячейки,поэтому теперь я создаю пользовательский шаблон для столбцов и использую текстовое поле для отображения данных.

Проблема

Texbox блокирует фон ячеек, поэтому я получаю (например) сетку данных с белымячейки (текстовые поля) с желтыми полями.

Вопрос

Как заставить текстовые поля (это мой случай) учитывать цвет фона ячеек?Я пытался использовать трюк и установить прозрачную кисть для всех текстовых полей, но я по-прежнему получаю белый фон в ячейках (текстовые поля).

Текущий код:

        grid.BeginInit();
        grid.Columns.Clear();


        int i = 0;

        var glass_brush = new SolidColorBrush(Color.FromArgb(255,0,0,0));

        foreach (var db_col in query.FieldNames)
        {
            var template = new DataTemplate();
            var elemFactory = new FrameworkElementFactory(typeof(TextBox));
            elemFactory.SetBinding(TextBox.TextProperty, new Binding(String.Format("Visual[{0}]", i)));
            // make the background transparent -- it does not work though
            elemFactory.SetValue(TextBlock.BackgroundProperty,glass_brush);
            template.VisualTree = elemFactory;

            var col = new DataGridTemplateColumn();
            col.CellTemplate = template;
            col.IsReadOnly = true;
            col.Header = db_col;
            grid.Columns.Add(col);
            ++i;
        }

        {
            grid.Items.Clear();


            foreach (var db_row in diffs)
            {
                var row = new DataGridRow();
                row.Item = db_row.Item1;
                row.Background = colors[db_row.Item2];
                grid.Items.Add(row);
            }
        }
        grid.IsReadOnly = true;

        grid.EndInit();

1 Ответ

4 голосов
/ 24 августа 2010

Вы устанавливаете TextBlock.BackgroundProperty, который основан на TextElement.BackgroundProperty, вместо настройки TextBox.BackgroundProperty или Control.BackgroundProperty, который основан на Panel.BackgroundProperty.Кроме того, ваша glass_brush - это непрозрачная черная кисть вместо прозрачной.Вы можете использовать Brushes.Transparent.Попробуйте:

elemFactory.SetValue(Control.BackgroundProperty, Brushes.Transparent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...