Эмуляция элементов управления OwnerDraw в WPF - PullRequest
1 голос
/ 04 июля 2010

В прошлом я разрабатывал настраиваемое поле со списком в выигрышных формах, в котором реализовано поведение автозаполнения, при котором совпадающая часть текста выделяется синим цветом, в то время как остальная часть строки имеет нормальный цвет фона.В выигрышных формах это можно сделать довольно просто, используя режим OwerDraw.Мне нужно сделать подобные вещи для элементов управления WPF.Я знаю, что в WPF шаблоны можно использовать для настройки отображения элементов управления, но поскольку шаблоны носят декларативный характер, я не уверен, как это будет работать - мне нужно изменить способ отображения текста в зависимости от внутреннего состояния элемента управления.,Я понимаю, что собираюсь немного почитать, чтобы понять это, но поскольку WPF - большая тема, я был бы признателен за некоторые указания в правильном общем направлении, поэтому я знаю, с чего начать.

Ответы [ 2 ]

0 голосов
/ 04 июля 2010

Важная вещь, которую следует помнить с WPF, заключается в том, что вы не запускаете команды рисования, когда им приказано рисовать, а скорее сообщаете системе рендеринга, какие типы фигур она должна отображать.Если вы хотите изучить низкоуровневое рисование, взгляните на класс DrawingVisual , который позволяет ставить команды рендеринга в очередь на уровне, аналогичном рисованию на холсте WinForms.Как упоминалось в codekaizen, в WPF это часто не требуется, но полезно знать, есть ли у вас что-то особенно сложное, что вы хотели бы инкапсулировать в элемент управления, или вам нужно создать множество этих элементов управления и повысить производительность.

0 голосов
/ 04 июля 2010

В WPF внешний вид элемента управления выполняется комбинацией шаблонов, стилей и иногда селекторов стилей. Если вы хотите изменить внешний вид элемента управления на основе состояния некоторых данных (он может быть внутренним или внешним по отношению к элементу управления, это на самом деле не имеет значения), то вы можете привязать значения стилей к этим данным и при их изменении внешний вид изменений элемента управления (при условии, что существует механизм уведомления для передачи изменений). Вы также можете преобразовать значения данных с помощью типов, называемых преобразователями значений (IValueConverter).

В качестве простого примера мы можем изменить стиль текста текстового блока на основе значения данных, лежащих в основе:

// In a C# class
public class MyState : INotifyPropertyChanged
{
     public bool IsEmphasized
     {
         get { return _isEmphasized; }
         set 
         { 
             if (_isEmphasized == value) 
             { 
                 return; 
             } 

             _isEmphasized = value;
             OnPropertyChanged("IsEmphasized"); // This is how to notify that the data is updated
     }
}


// A converter
public class BooleanToBoldConverter : IValueConverter
{
    public Object ConvertTo(Object value)
    {
        if (value is bool)
        {
             if ((bool)value)
             {
                 return FontWeights.Bold;
             }
             else 
             {
                 return FontWeights.Normal;
             }
        }
    }
}

<TextBlock DataContext="{Binding Source={StaticResource myStateInstance}}" 
           FontWeight="{Binding IsEmphasized, Converter={StaticResource BooleanToBoldConverter}}" Text="Text" />

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...