Выделить текст в датагрид - PullRequest
0 голосов
/ 20 января 2012

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

public class SearchableTextBlock
{
    public static DependencyProperty SearchPhraseProperty =
        DependencyProperty.RegisterAttached(
            "SearchPhrase",
            typeof(string),
            typeof(SearchableTextBlock), new PropertyMetadata("", SearchPhraseChanged));

    public static string GetSearchPhrase(UIElement element)
    {
        return (string)element.GetValue(SearchPhraseProperty);
    }
    public static void SetSearchPhrase(UIElement element, string value)
    {
        element.SetValue(SearchPhraseProperty, value);
    }
    public static void SearchPhraseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (e.NewValue == null)
            return;

        if ((d as TextBlock) != null)
        {
            TextBlock tbx = d as TextBlock;

            String text = tbx.Text;
            tbx.Inlines.Clear();

            string txtStore = "";

            //Loops throught the entire text
            for (int i = 0; i < text.Length; i++)
            {
                txtStore += text[i];
                //If search phrase is found
                if (txtStore.ToUpper().IndexOf((e.NewValue as string).ToUpper()) > -1)
                {
                    //Creates the formatting for regular text 
                    Run runRegular = new Run();
                    runRegular.Text = txtStore.Substring(0, txtStore.ToUpper().IndexOf((e.NewValue as string).ToUpper()));

                    //Creates the formatting for the found text
                    //Foreground is hardcoded to red. 
                    Run runHighlight = new Run();
                    runHighlight.Text = txtStore.Substring(txtStore.ToUpper().IndexOf((e.NewValue as string).ToUpper()), txtStore.Length - (txtStore.ToUpper().IndexOf((e.NewValue as string).ToUpper())));
                    runHighlight.Foreground = new SolidColorBrush(Colors.Red);
                    runHighlight.FontWeight = FontWeights.Bold;

                    //Inserts the formatted text to the textblock 
                    txtStore = "";
                    tbx.Inlines.Add(runRegular);
                    tbx.Inlines.Add(runHighlight);
                }
            }

            Run runRemaining = new Run();
            runRemaining.Text = txtStore;
            tbx.Inlines.Add(runRemaining);
        }
    }
}

Вот мой XAML:

<sdk:DataGridTemplateColumn x:Name="Database" >
                <sdk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Database}"
                                sTextBlock:SearchableTextBlock.SearchPhrase="{Binding SDatabase, Mode=TwoWay}"/>
                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>

Спасибо!

1 Ответ

0 голосов
/ 22 января 2012

Вы можете попробовать отключить виртуализацию DataGrid.Попробуйте решение Xusan в этом посте .

Надеюсь, это поможет.

Мигель

...