| クイックスタート > 手順 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 コントロールにコンテンツを追加しました。次の手順では、このコントロールで可能な実行時の操作をいくつか示します。