5

WPFで新しいアプリケーションを開始したい。WPF の新しいユーザー インターフェイスには、DataGridViewコントロールとPropertyGridコントロールが必要です。しかし、これら 2 つのコントロールは WPF には存在しないようですWindowsFormsHost

しかし、私がそれを行うと、このアプローチで誰かが予見する制限はありますか?

4

3 に答える 3

6

Data binding主な制限は、WPF のすべての強力な機能が失わ ControlTemplatesれることDataTemplatesです。それはあきらめることがたくさんあります!古い退屈でエラーが発生しやすい WinForms 手法を使用してこれらのコントロールをプログラムし、何年も前に解放したすべての制限に再び対処する必要があります。OpacityAttached Properties

DataGridView

NET Framework 3.5 sp1 にはDataGrid、ジョブを実行する可能性のある があり、Xceed のものなど、このためのサードパーティ コントロールがいくつかあります。WPF ベースのグリッドを使用すると、WinForms の DataGridView を使用する場合には不可能な、グリッド内での完全なデータ バインディング、テンプレート作成、およびスタイリングが可能になります。

プロパティ グリッド

WPF に が付属していない理由PropertyGridは、WPF で既に提供されているものを使用して簡単に再作成できるからです。適切にスタイル設定された単純なリストボックスで、わずか数行のコード ビハインドで十分です。

WPFPropertyGrid実装を使用する利点は、テンプレートを使用して編集中のプロパティを表示できることです。最も重要なことは、いくつかのバインディングを使用して XAML でプロパティ エディターを表現するだけで、新しいプロパティ エディターを追加できることです。たとえば、あるプロパティ グリッドの一部のプロパティはスライダーで設定されていますが、これを実現するのにわずか 5 行の XAML が必要でした。

WPF での PropertyGrid の実装の背後にある重要な概念を示すコードを次に示します。

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 でのルック アンド フィール全体を非常に迅速かつ簡単に複製できます。カテゴリ別にグループ化されたItemTemplateListBoxを使用するだけで、プロパティ名にバインドされDockPanelた固定幅を含むとプロパティ エディタを印刷します。TextBlockContentPresenter

于 2009-11-12T07:17:28.513 に答える
2

まず、WPF用のサードパーティのプロパティグリッドデータ グリッドがあり、これらは通常、WPFの追加のスタイリング機能をサポートし、WPFアプリケーションにより慣用的に適合します。したがって、WinFormsに戻る必要はありません。サードパーティまたはツールキットのコントロールが実際にオプションでない限り、おそらくそうすべきではありません。

WinFormsに戻る必要がある場合、注意すべき主な制限は「空域ルール」です。つまり、WinFormsとWPFコントロールを互いにオーバーラップさせることはできません。さらに、もちろん、WinFormsコントロールはWPFデータバインディングに参加できず、これを回避するためにユーザーコントロールにカプセル化することもできますが、古い形式の手続き型コードを使用して対処する必要があります。また、派手な視覚効果を実行しようとしている場合は、WinFormsコントロールではうまく機能しない可能性があります。WinFormsコントロールの近くで変換やアニメーションを実行している場合、空域ルールはあなたを苦しめる可能性があります。ただし、視覚的に単純なアプリケーションの場合は、問題なく動作するはずです。

于 2009-11-12T06:55:20.893 に答える
1

WPFツールキットにはDatagridコントロールがあります。CodePlexにもサードパーティのPropertyGridコントロールがあります(非常に寛容なMS-PLライセンスの下で)。

于 2009-11-12T06:56:30.583 に答える