Ограничения использования элементов управления .NET 2.0 (Windows Forms) в WPF? - PullRequest
5 голосов
/ 12 ноября 2009

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

Однако, если я это сделаю, есть ли какие-нибудь ограничения, которые кто-либо предвидел с этим подходом?

Ответы [ 3 ]

6 голосов
/ 12 ноября 2009

Основным ограничением является то, что вы теряете все мощные функции WPF: Data binding, ControlTemplates и DataTemplates, бесконечный размер, масштабирование / вращение, Opacity, Attached Properties, и это лишь некоторые из них. Это много, чтобы сдаться! Вам придется запрограммировать эти элементы управления, используя старые утомительные и подверженные ошибкам методы WinForms, и снова разобраться со всеми теми ограничениями, от которых вы освободились несколько лет назад.

DataGridView

NET Framework 3.5 sp1 имеет DataGrid, который может выполнять эту работу, и для этого есть несколько сторонних элементов управления, например, из Xceed. Использование сетки на основе WPF обеспечивает полное связывание, создание шаблонов и стилизацию внутри сетки, что было бы невозможно, если вы используете WinForms DataGridView.

PropertyGrid

Причина, по которой WPF не поставляется с PropertyGrid, заключается в том, что его так легко воссоздать, используя то, что уже дает вам WPF: простой список будет работать в правильном стиле с несколькими строками кода.

Преимущество использования реализации WPF PropertyGrid заключается в том, что вы можете использовать шаблоны для представления редактируемых свойств, а самое главное вы можете добавлять новые редакторы свойств, просто выражая их в XAML с несколькими привязками. Например, некоторые из свойств в одной из наших сеток свойств устанавливаются с помощью ползунков, и для этого потребовалось всего около пяти строк XAML.

Вот код, иллюстрирующий ключевые концепции реализации PropertyGrid в WPF:

public class PropertyGrid
{
  ...
  public static readonly DependencyProperty SelectedObjectProperty = ...
  {
    PropertyChangedCallback = (obj, e) =>
    {
      PropertyItems =
        from pi in SelectedObject.GetType().GetProperties()
        select new PropertyGridItem { Object = SelectedObject, PropertyInfo = pi };
    }
  }
}

public class PropertyInfo
{
  public object Object;
  public PropertyInfo PropertyInfo;
  public object Value
  {
    get { return PropertyInfo.GetValue(Object); }
    set { PropertyInfo.SetValue(Object, value); }
  }
  public string Category
  {
    get
    {
      return (
        from attrib in PropertyInfo.GetCustomAttributes().OfType<CategoryAttribute>()
        select attrib.Name
      ).FirstOrDefault();
    }
  }
}

При этом очень быстро и легко можно воспроизвести весь внешний вид PropertyGrid с помощью нескольких строк XAML: просто используйте ListBox с группировкой по категориям и ItemTemplate, состоящий из DockPanel содержит фиксированную ширину TextBlock, связанную с именем свойства, и ContentPresenter для печати редактора свойств.

2 голосов
/ 12 ноября 2009

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

Если вам нужно вернуться к WinForms, главное ограничение, о котором нужно знать, это «правило воздушного пространства»: вы не можете иметь элементы управления WinForms и WPF, накладывающиеся друг на друга. Плюс, конечно, элементы управления WinForms не могут участвовать в связывании данных WPF, и их нужно решать с помощью процедурного кода old-skool, хотя вы можете обернуть их в пользовательские элементы управления, чтобы обойти это. Кроме того, если вы пытаетесь создавать причудливые визуальные эффекты, то они могут работать не очень хорошо с элементами управления WinForms: правило воздушного пространства, вероятно, сильно укусит вас, если вы выполняете преобразования или анимацию рядом с элементом управления WinForms. Но для визуально простых приложений они должны работать нормально.

1 голос
/ 12 ноября 2009

В WPF Toolkit есть элемент управления Datagrid . В CodePlex также есть стороннее управление PropertyGrid (под очень разрешительной лицензией MS-PL).

...