クイックスタート > 手順 2:コントロールへのコンテンツの追加 |
前の手順では、WPF/Silverlight アプリケーションを作成し、プロジェクトにC1OrgChart コントロールを追加しました。この手順では、C1OrgChart コントロールにコンテンツを追加します。この手順では、いくつかのコードファイルを追加しますが、それらのファイルは ComponentOne for WPF/Silverlight のサンプルに付属しています。このサンプルは、デフォルトでは、ComponentOne Samples\WPF\C1.WPF.OrgChart\OrgChart_Demo または ComponentOne Samples\Silverlight \C1.Silverlight.OrgChart\OrgChart_Demo ディレクトリの Documents フォルダにインストールされます。コードはこのページにも記載されていますが、手っ取り早くコードファイルを見つけて追加することもできます。プロジェクトをカスタマイズしてアプリケーションの C1OrgChart コントロールにコンテンツを追加するには、次の手順に従います。
ソリューションエクスプローラで、MainWindow.xaml ファイルを右クリックして[コードの表示]を選択します。コードファイルが開きます。
コードファイルを次のように編集します。
コードのコピー
|
|
---|---|
Partial Public Class MainWindow Inherits Window Public Sub New() InitializeComponent() CreateData() End Sub Private Sub Button_Click(sender As Object, e As RoutedEventArgs) CreateData() End Sub Private Sub CheckBox_Click(sender As Object, e As RoutedEventArgs) _orgChart.Orientation = If(DirectCast(sender, CheckBox).IsChecked.Value, Orientation.Horizontal, Orientation.Vertical) End Sub Private Sub CreateData() Dim p = Data.Person.CreatePerson(10) _tbTotal.Text = String.Format(" ({0} items total)", p.TotalCount) _orgChart.Header = p End Sub End Class Public Class PersonTemplateSelector Inherits DataTemplateSelector Public Overrides Function SelectTemplate(item As Object, _container As DependencyObject) As DataTemplate Dim p = TryCast(item, Data.Person) Dim e = TryCast(container, FrameworkElement) Return If(p.Position.IndexOf("Director") > -1, _TryCast(e.Resources("_tplDirector"), DataTemplate), TryCast(e.Resources("_tplOther"), DataTemplate)) End Function End Class |
コードのコピー
|
|
---|---|
namespace QuickStart { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); CreateData(); } void Button_Click(object sender, RoutedEventArgs e) { CreateData(); } void CheckBox_Click(object sender, RoutedEventArgs e) { _orgChart.Orientation = ((CheckBox)sender).IsChecked.Value ? Orientation.Horizontal : Orientation.Vertical; } void CreateData() { var p = Data.Person.CreatePerson(10); _tbTotal.Text = string.Format(" ({0} items total)", p.TotalCount); _orgChart.Header = p; } } public class PersonTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { var p = item as Data.Person; var e = container as FrameworkElement; return p.Position.IndexOf("Director") > -1 ? e.Resources["_tplDirector"] as DataTemplate : e.Resources["_tplOther"] as DataTemplate; } } } |
次のコードを EnumerationExtension コードファイルに追加します。
コードのコピー
|
|
---|---|
Imports System.Windows Imports System.Windows.Controls Imports System.Windows.Markup Imports System.Reflection Imports System.Collections.Generic Namespace Util Public Class EnumerationExtension Inherits MarkupExtension Public Property EnumType() As Type Get Return m_EnumType End Get Set(value As Type) m_EnumType = Value End Set End Property Private m_EnumType As Type Public Overrides Function ProvideValue(serviceProvider As IServiceProvider) As Object Dim list = New List(Of Object)() For Each value In EnumType.GetFields(BindingFlags.[Public] Or BindingFlags.[Static]) list.Add(value.GetValue(Nothing)) Next Return list End Function End Class End Namespace |
コードのコピー
|
|
---|---|
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Markup; using System.Reflection; using System.Collections.Generic; namespace Util { public class EnumerationExtension : MarkupExtension { public Type EnumType { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { var list = new List<object>(); foreach (var value in EnumType.GetFields(BindingFlags.Public { list.Add(value.GetValue(null)); } return list; } } } |
このコードは、ComboBox コントロールを列挙値に連結して、設定する連結値を実行時に選択できるようにします。
ソリューションエクスプローラに移動し、プロジェクト名を右クリックし、[追加]→[新しい項目]を選択します。[新しい項目の追加]ダイアログボックスで、[コードファイル]テンプレートを見つけます。「Person」と名前を付け、[追加]をクリックします。 新しいコードファイルが開きます。このコードファイルはサンプルにも含まれているので、そのファイルを単に追加することもできます。
次のコードを Person コードファイルに追加します。
コードのコピー
|
|
---|---|
Imports System.Collections Imports System.Collections.Generic Imports System.Collections.ObjectModel Namespace Data Public Class Person Private _list As New ObservableCollection(Of Person)() #Region "** object model" Public Property Name() As String Get Return m_Name End Get Set(value As String) m_Name = Value End Set End Property Private m_Name As String Public Property Position() As String Get Return m_Position End Get Set(value As String) m_Position = Value End Set End Property Private m_Position As String Public Property Notes() As String Get Return m_Notes End Get Set(value As String) m_Notes = Value End Set End Property Private m_Notes As String Public ReadOnly Property Subordinates() As IList(Of Person) Get Return _list End Get End Property Public ReadOnly Property TotalCount() As Integer Get Dim count = 1 For Each p In Subordinates count += p.TotalCount Next Return count End Get End Property Public Overrides Function ToString() As String Return String.Format("{0}:" & vbCr & vbLf & vbTab & "{1}", Name, Position) End Function #End Region #Region "** Person factory" Shared _rnd As New Random() Shared _positions As String() = "Director|Manager|Designer|Developer|Writer|Assistant".Split(" Shared _areas As String() = "Development|Marketing|Sales|Support|Accounting".Split(" Shared _first As String() = "John|Paul|Dan|Dave|Rich|Mark|Greg|Erin|Susan|Sarah|Tim|Trevor|Kevin|Mark|Dewey|Huey|Larry|Moe|Curly|Adam|Albert".Split(" Shared _last As String() = "Smith|Doe|Williams|Sorensen|Hansen|Mandela|Johnson|Ward|Woodman|Jordan|Mays|Kevorkian|Trudeau|Hendrix|Clinton".Split(" Shared _verb As String() = "likes|reads|studies|hates|exercises|dreams|plays|writes|argues|sleeps|ignores".Split(" Shared _adjective As String() = "long|short|important|pompous|hard|complex|advanced|modern|boring|strange|curious|obsolete|bizarre".Split(" Shared _noun As String() = "products|tasks|goals|campaigns|books|computers|people|meetings|food|jokes|accomplishments|screens|pages".Split(" Public Shared Function CreatePerson(level As Integer) As Person Dim p = CreatePerson If level > 0 Then level -= 1 For i As Integer = 0 To _rnd.[Next](1, 4) - 1 p.Subordinates.Add(CreatePerson(_rnd.[Next](level \ 2, level))) Next End If Return p End Function Public Shared Function CreatePerson() As Person Dim p = New Person() p.Position = String.Format("{0} of {1}", GetItem(_positions), GetItem(_areas)) p.Name = String.Format("{0} {1}", GetItem(_first), GetItem(_last)) p.Notes = String.Format("{0} {1} {2} {3}", p.Name, GetItem(_verb), GetItem(_adjective), GetItem(_noun)) While _rnd.NextDouble() < 0.5 p.Notes += String.Format(" and {0} {1} {2}", GetItem(_verb), GetItem(_adjective), GetItem(_noun)) End While p.Notes += "." Return p End Function Private Shared Function GetItem(list As String()) As String Return list(_rnd.[Next](0, list.Length)) End Function #End Region End Class End Namespace |
コードのコピー
|
|
---|---|
using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Data { public class Person { ObservableCollection<Person> _list = new ObservableCollection<Person>(); #region ** object model public string Name { get; set; } public string Position { get; set; } public string Notes { get; set; } public IList<Person> Subordinates { get { return _list; } } public int TotalCount { get { var count = 1; foreach (var p in Subordinates) { count += p.TotalCount; } return count; } } public override string ToString() { return string.Format("{0}:\r\n\t{1}", Name, Position); } #endregion #region ** Person factory static Random _rnd = new Random(); static string[] _positions = "Director|Manager|Designer|Developer|Writer|Assistant".Split(' static string[] _areas = "Development|Marketing|Sales|Support|Accounting".Split(' static string[] _first = "John|Paul|Dan|Dave|Rich|Mark|Greg|Erin|Susan|Sarah|Tim|Trevor|Kevin|Mark|Dewey|Huey|Larry|Moe|Curly|Adam|Albert".Split(' static string[] _last = "Smith|Doe|Williams|Sorensen|Hansen|Mandela|Johnson|Ward|Woodman|Jordan|Mays|Kevorkian|Trudeau|Hendrix|Clinton".Split(' static string[] _verb = "likes|reads|studies|hates|exercises|dreams|plays|writes|argues|sleeps|ignores".Split(' static string[] _adjective = "long|short|important|pompous|hard|complex|advanced|modern|boring|strange|curious|obsolete|bizarre".Split(' static string[] _noun = "products|tasks|goals|campaigns|books|computers|people|meetings|food|jokes|accomplishments|screens|pages".Split(' public static Person CreatePerson(int level) { var p = CreatePerson(); if (level > 0) { level--; for (int i = 0; i < _rnd.Next(1, 4); i++) { p.Subordinates.Add(CreatePerson(_rnd.Next(level / 2, level))); } } return p; } public static Person CreatePerson() { var p = new Person(); p.Position = string.Format("{0} of {1}", GetItem(_positions), GetItem(_areas)); p.Name = string.Format("{0} {1}", GetItem(_first), GetItem(_last)); p.Notes = string.Format("{0} {1} {2} {3}", p.Name, GetItem(_verb), GetItem(_adjective), GetItem(_noun)); while (_rnd.NextDouble() < .5) { p.Notes += string.Format(" and {0} {1} {2}", GetItem(_verb), GetItem(_adjective), GetItem(_noun)); } p.Notes += "."; return p; } static string GetItem(string[] list) { return list[_rnd.Next(0, list.Length)]; } #endregion } } |
このコードは、C1OrgChart に項目を表示するための再帰的な ObservableCollection を含む単純なクラスを作成し、単純な組織図を構築するためのメソッドを作成します。C1OrgChart コントロールのデフォルトのテンプレートは、ToString メソッドを使用して、表示するテキストを決定します。DataTemplate を使用しない場合は、(上のコードのように)このメソッドをオーバーライドする必要があります(DataTemplate を使用する場合は、そこで連結を設定し、ToString は無視できます)。
この手順では、C1OrgChart コントロールにコンテンツを追加しました。次の手順では、このコントロールで可能な実行時の操作をいくつか示します。