Настройка фокуса строки таблицы и ее фокуса с помощью обработчиков событий с помощью c # в приложении wpf - PullRequest
0 голосов
/ 27 июня 2018

У меня есть таблица, размещенная в FlowDocument. Я добавляю данные в таблицу динамически, используя c # на сервере. Я прикрепил обработчик событий для фокусировки строки, но у меня возникает проблема с удалением фокуса, если пользователь щелкнет где-нибудь кроме этой строки.

Мой код XAML такой:

<FlowDocumentScrollViewer Width="auto">
                <FlowDocument>
                    <Table x:Name="feedTable">
                        <Table.Columns>
                            <TableColumn Width="*"/>
                            <TableColumn Width="3*"/>
                            <TableColumn Width="2*"/>
                            <TableColumn Width="4*"/>
                            <TableColumn Width="*"/>
                        </Table.Columns>
                        <TableRowGroup>
                            <TableRow>
                                <TableCell>
                                    <Paragraph FontSize="14pt" FontWeight="Bold">On</Paragraph>
                                </TableCell>
                                <TableCell>
                                    <Paragraph FontSize="14pt" FontWeight="Bold">Feed Link</Paragraph>
                                </TableCell>
                                <TableCell>
                                    <Paragraph FontSize="14pt" FontWeight="Bold">Site</Paragraph>
                                </TableCell>
                                <TableCell>
                                    <Paragraph FontSize="14pt" FontWeight="Bold">Title</Paragraph>
                                </TableCell>
                                <TableCell>
                                    <Paragraph FontSize="14pt" FontWeight="Bold">Feeds</Paragraph>
                                </TableCell>
                            </TableRow>
                        </TableRowGroup>
                        <TableRowGroup x:Name="feedTableRowGroup">

                        </TableRowGroup>
                    </Table>
                </FlowDocument>
            </FlowDocumentScrollViewer>

Вот как я добавляю данные в таблицу на бэкэнде после получения их из базы данных

for (int i = 0; i < data.Rows.Count; i++)
        {
            feedTableRowGroup.Rows.Add(new TableRow());
            var currentRow = feedTableRowGroup.Rows[feedTableRowGroup.Rows.Count - 1];

            CheckBox checkBox = new CheckBox();
            checkBox.Tag = ((int)data.Rows[i]["id"]).ToString();
            checkBox.IsChecked = (byte)data.Rows[i]["is_enabled"] == 1 ? true : false;

            Paragraph paragraph = new Paragraph();
            paragraph.Inlines.Add(checkBox);

            int maxChars = 25;
            string link = (string)data.Rows[i]["link"];
            link = link.Length <= maxChars ? link : link.Substring(0, maxChars) + "....";

            currentRow.Cells.Add(new TableCell(paragraph));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run(link))));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run((string)data.Rows[i]["site_name"]))));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run((string)data.Rows[i]["title"]))));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run(((int)data.Rows[i]["items_count"]).ToString()))));

            currentRow.MouseDown += new MouseButtonEventHandler(FocusTableRow);

        }

«currentRow.MouseDown» добавляет фокус к строке, когда я нажимаю на нее, но теперь, когда я нажимаю на другое пустое место, я хочу удалить этот фокус.

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

private void FocusTableRow(object sender, RoutedEventArgs e)
    {
       sender.GetType().GetProperty("Background").SetValue(sender, Brushes.LightGray);    
    }

    private void NonFocusTableRow(object sender, RoutedEventArgs e)
    {
        sender.GetType().GetProperty("Background").SetValue(sender, Brushes.White);
    }

Есть ли какой-либо Eventhadler, который я могу использовать, чтобы назначить, чтобы убрать этот фокус из строки?

1 Ответ

0 голосов
/ 27 июня 2018

Я не совсем уверен, что вы подразумеваете под «фокусом» для строки, поскольку весь ваш код делает выделение строки другим цветом фона («Фокус» означает нечто иное, говоря о графическом интерфейсе). Но если предположить, что это является намерением, и предположить, что одновременно можно «сфокусировать» только одну строку, есть несколько способов выполнить то, что вы описываете. Я бы не стал делать это таким образом, но не зная больше о вашем коде и данных из того, что вы дали ...

Во-первых, когда вы выделяете указанную строку, отключите подсветку на всех других строках ...

private void FocusTableRow (object sender, RoutedEventArgs e)
{
    sender.GetType ().GetProperty ("Background").SetValue (sender, Brushes.LightGray);

    foreach (var row in feedTableRowGroup.Rows) {
        if (row != sender) {
            row.GetType ().GetProperty ("Background").SetValue (row, Brushes.White);
        }
    }

    e.Handled = true;
}

Я также добавил e.Handled = true, чтобы сигнализировать о том, что мы обработали событие нажатия мыши, и остановить кого-либо еще от его обработки.

Затем добавьте обработчик MouseDown в feedTable (либо в ctor, либо в том месте, где вы инициализируете данные), чтобы ловить при щелчке вне строк и отключать все выделения строк ...

feedTable.MouseDown += FeedTable_MouseDown;

...

private void FeedTable_MouseDown (object sender, MouseButtonEventArgs e)
{
    foreach (var row in feedTableRowGroup.Rows) {
        row.GetType ().GetProperty ("Background").SetValue (row, Brushes.White);
    }
}

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

...