C1OrgChart では、TreeView コントロールと同様に動作する折りたたみ可能な C1OrgChart を作成できます。C1OrgChart ノードを展開/折りたたむには、次の手順に従います。
XAML でマークアップの書き方
| マークアップ |
コードのコピー
|
|---|---|
<!-- 組織図 -->
<ScrollViewer Grid.Row="2" HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<orgchart:C1OrgChart
x:Name="_orgChart"
Grid.Row="1"
Orientation="Vertical"
HorizontalAlignment="Center" VerticalAlignment="Center"
ConnectorStroke="OrangeRed" ConnectorThickness="{Binding Path=Subordinates.Count}"
Foreground="#FF39B925" Xaml:C1NagScreen.Nag="True" >
<!-- スケール変換をスライダに連結する -->
<orgchart:C1OrgChart.RenderTransform>
<ScaleTransform
ScaleX="{Binding Value, ElementName=_sliderZoom}"
ScaleY="{Binding Value, ElementName=_sliderZoom}" />
</orgchart:C1OrgChart.RenderTransform>
<!-- ツリーノードの表示に使用されるテンプレート -->
<orgchart:C1OrgChart.ItemTemplate>
<DataTemplate>
<!-- 外側境界線 -->
<Border
Background="WhiteSmoke" BorderBrush="Black"
BorderThickness="1 1 2 2" CornerRadius="6"
MaxWidth="200" >
<StackPanel Orientation="Vertical" >
<!-- 項目ヘッダー -->
<Border CornerRadius="6 6 0 0" Background="Black" >
<StackPanel Orientation="Horizontal">
<!-- CheckBox を C1OrgChart の IsCollapsed プロパティに連結します -->
<CheckBox Margin="4 0" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>
<!-- 項目ヘッダー:人の名前 -->
<TextBlock Text="{Binding Name}" FontWeight="Bold" FontSize="14" Foreground="WhiteSmoke"
Padding="4 0 0 0" />
</StackPanel>
</Border>
<!-- 本体:人の詳細 -->
<TextBlock Text="{Binding Notes}" Padding="6 0" FontSize="9.5" TextWrapping="Wrap" />
<TextBlock Text="{Binding Position}" Padding="6 0" FontSize="12" FontStyle="Italic"
HorizontalAlignment="Right" />
</StackPanel>
</Border>
</DataTemplate>
</orgchart:C1OrgChart.ItemTemplate>
</orgchart:C1OrgChart>
</ScrollViewer>
|
|
<Grid> タグの下で <Scrollviewer> タグの前に追加します。これはいくつかの Grid 行定義、アプリケーションのタイトル、ボタンとスライダを含むコントロールパネルを追加します。このコントロールパネルを使用して、C1OrgChart のズーム、方向、データを制御できます。XAML でマークアップの書き方
| マークアップ |
コードのコピー
|
|---|---|
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<!-- サンプルタイトル -->
<StackPanel Orientation="Horizontal" >
<TextBlock Text="C1OrgChart: Collapse/Expand Sample" FontSize="16"
VerticalAlignment="Bottom" Foreground="Black" />
<TextBlock x:Name="_tbTotal" VerticalAlignment="Bottom" />
</StackPanel>
<!-- コントロールパネル -->
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" Grid.Row="1">
<Button Content="データを更新" Padding="8 0" Click="Button_Refresh_Click"
Foreground="Black" BorderBrush="Black" />
<TextBlock Text=" ズーム: " VerticalAlignment="Center" />
<Slider x:Name="_sliderZoom" Minimum=".01" Maximum="1" Value="1" Width="100"
SmallChange="0.01" StepFrequency="0.01" Height="44" HorizontalAlignment="Left"
Foreground="#FFFF1B1B" Background="#29C91515" VerticalAlignment="Center" />
<CheckBox Margin="20 0" Content="水平方向" Click="CheckBox_Click"
Background="#FF0Cffff" Foreground="Black" />
<Button Content="3 レベルまで展開する" Padding="8 0"
Click="Button_Collapse_Click" Foreground="Black" BorderBrush="Black" />
</StackPanel>
|
|
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
Imports C1.Xaml.OrgChart |
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
using C1.Xaml.OrgChart |
|
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
CreateData() |
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
CreateData(); |
|
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
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 Button_Refresh_Click(sender As Object, e As RoutedEventArgs)
CreateData()
End Sub
' 組織図をレベル3まで折りたたみます
Private Sub Button_Collapse_Click(sender As Object, e As RoutedEventArgs)
ToggleCollapseExpand(_orgChart, 0, 3)
End Sub
' 組織図を指定されたレベルまで折りたたみます
Private Sub ToggleCollapseExpand(node As C1OrgChart, level As Integer,
maxLevel As Integer)
If level >= maxLevel Then
node.IsCollapsed = True
Else
node.IsCollapsed = False
For Each subNode In node.ChildNodes
ToggleCollapseExpand(subNode, level + 1, maxLevel)
Next
End If
End Sub
|
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
void CheckBox_Click(object sender, RoutedEventArgs e)
{
_orgChart.Orientation = ((CheckBox)sender).IsChecked.Value
? Orientation.Horizontal
: Orientation.Vertical;
}
// 新しいランダムデータを使用して組織図を再構築します
void Button_Refresh_Click(object sender, RoutedEventArgs e)
{
CreateData();
}
// 組織図をレベル3まで折りたたみます
void Button_Collapse_Click(object sender, RoutedEventArgs e)
{
ToggleCollapseExpand(_orgChart, 0, 3);
}
// 組織図を指定されたレベルまで折りたたみます
void ToggleCollapseExpand(C1OrgChart node, int level, int maxLevel)
{
if (level >= maxLevel)
{
node.IsCollapsed = true;
}
else
{
node.IsCollapsed = false;
foreach (var subNode in node.ChildNodes)
{
ToggleCollapseExpand(subNode, level + 1, maxLevel);
}
}
}
|
|
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
' ランダムデータを作成し、それを組織図に割り当てます
Private Sub CreateData()
Dim p = Person.CreatePerson(15)
_tbTotal.Text = String.Format(" ({0} items total)", p.TotalCount)
_orgChart.Header = p
End Sub
' OrgChart サンプルに展開/折りたたみのサポートを追加します
Private Sub CheckBox_Unchecked(sender As Object, e As RoutedEventArgs)
CheckedChanged(sender)
End Sub
Private Sub CheckBox_Checked(sender As Object, e As RoutedEventArgs)
CheckedChanged(sender)
End Sub
Private Sub CheckedChanged(sender As Object)
Dim checkBox As CheckBox = TryCast(sender, CheckBox)
Dim parent As FrameworkElement = TryCast(VisualTreeHelper.GetParent(checkBox),
FrameworkElement)
While parent IsNot Nothing AndAlso Not (TypeOf parent Is C1OrgChart)
parent = TryCast(VisualTreeHelper.GetParent(parent), FrameworkElement)
End While
If parent IsNot Nothing Then
Dim orgChart As C1OrgChart = TryCast(parent, C1OrgChart)
If checkBox.IsChecked IsNot Nothing Then
orgChart.IsCollapsed = checkBox.IsChecked.Value
End If
End If
End Sub
|
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
// ランダムデータを作成し、それを組織図に割り当てます
void CreateData()
{
var p = Person.CreatePerson(15);
_tbTotal.Text = string.Format(" ({0} items total)", p.TotalCount);
_orgChart.Header = p;
}
// OrgChart サンプルに展開/折りたたみのサポートを追加します
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
CheckedChanged(sender);
}
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
CheckedChanged(sender);
}
private void CheckedChanged(object sender)
{
CheckBox checkBox = sender as CheckBox;
FrameworkElement parent = VisualTreeHelper.GetParent(checkBox)
as FrameworkElement;
while (parent != null && !(parent is C1OrgChart))
{
parent = VisualTreeHelper.GetParent(parent) as FrameworkElement;
}
if (parent != null)
{
C1OrgChart orgChart = parent as C1OrgChart;
if (checkBox.IsChecked != null)
{
orgChart.IsCollapsed = checkBox.IsChecked.Value;
}
}
}
}
}
|
|
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
Imports System Imports System.Collections Imports System.Collections.Generic Imports System.Collections.ObjectModel |
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; |
|
Visual Basic コードの書き方
| Visual Basic |
コードのコピー
|
|---|---|
Namespace Data
''' <summary>
''' 階層化データ項目:Person は型 Person の Subordinates を持つ。
''' </summary>
PublicClassPerson
Private _list AsNewObservableCollection(OfPerson)()
#Region"** object model"
PublicProperty Name() AsString
Get
Return m_Name
EndGet
Set(value AsString)
m_Name = Value
EndSet
EndProperty
Private m_Name AsString
PublicProperty Position() AsString
Get
Return m_Position
EndGet
Set(value AsString)
m_Position = Value
EndSet
EndProperty
Private m_Position AsString
PublicProperty Notes() AsString
Get
Return m_Notes
EndGet
Set(value AsString)
m_Notes = Value
EndSet
EndProperty
Private m_Notes AsString
PublicReadOnlyProperty Subordinates() AsIList(OfPerson)
Get
Return _list
EndGet
EndProperty
PublicReadOnlyProperty TotalCount() AsInteger
Get
Dim count = 1
ForEach p In Subordinates
count += p.TotalCount
Next
Return count
EndGet
EndProperty
PublicOverridesFunction ToString() AsString
ReturnString.Format("{0}:" & vbCr & vbLf & vbTab & "{1}", Name, Position)
EndFunction
#EndRegion
#Region"** Person factory"
Shared _rnd AsNewRandom()
Shared _positions AsString() = "アシスタント|部長|ツールデザイナー|設計エンジニア|
副部長|スペシャリスト".Split("|"c)
Shared _areas AsString() = "開発部|ツール設計部|営業部|マーケティング部|人事部|
経理部|総務部".Split("|"c)
Shared _first AsString() = "浩|誠|健一|大輔|達也|翔太|浩一|哲也|剛|大介|
健太|拓也|豊|修|和彦|学|直樹|健太郎|浩二|徹|隆|亮|翔|恵子|久美子|由美子|
明美|直美|陽子|智子|絵美|恵|裕子|愛|真由美|由美|麻衣|美穂|愛美|彩".Split("|"c)
Shared _last AsString() = "佐藤|鈴木|高橋|田中|伊藤|山本|渡辺|中村|小林|
加藤|吉田|山田|佐々木|山口|松本|井上|木村|斎藤|林|清水|山崎|阿部|森|池田|
橋本|山下|石川|中島|前田|藤田".Split("|"c)
Shared _verb AsString() = "likes|reads|studies|hates|exercises|dreams|
plays|writes|argues|sleeps|ignores".Split("|"c)
Shared _adjective AsString() = "long|short|important|pompous|hard|complex|
advanced|modern|boring|strange|curious|obsolete|bizarre".Split("|"c)
Shared _noun AsString() = "products|tasks|goals|campaigns|books|computers|
people|meetings|food|jokes|accomplishments|screens|pages".Split("|"c)
PublicSharedFunction CreatePerson(level AsInteger) AsPerson
Dim p = CreatePerson()
If level > 0 Then
level -= 1
For i AsInteger = 0 To _rnd.[Next](1, 4) - 1
p.Subordinates.Add(CreatePerson(_rnd.[Next](level \ 2, level)))
Next
EndIf
Return p
EndFunction
PublicSharedFunction CreatePerson() AsPerson
Dim p = NewPerson()
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))
EndWhile
p.Notes += "."
Return p
EndFunction
PrivateSharedFunction GetItem(list AsString()) AsString
Return list(_rnd.[Next](0, list.Length))
EndFunction
#EndRegion
EndClass
EndNamespace
|
|
C# コードの書き方
| C# |
コードのコピー
|
|---|---|
namespace CollapseExpand
{
/// <summary>
/// 階層化データ項目:Person は型 Person の Subordinates を持つ。
/// </summary>
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 = "アシスタント|部長|ツールデザイナー|設計
エンジニア|副部長|スペシャリスト".Split('
static string[] _areas = "開発部|ツール設計部|営業部|マーケティング部|
人事部|経理部|総務部".Split('
static string[] _first = "浩|誠|健一|大輔|達也|翔太|浩一|哲也|剛|
大介|健太|拓也|豊|修|和彦|学|直樹|健太郎|浩二|徹|隆|亮|翔|恵子|
久美子|由美子|明美|直美|陽子|智子|絵美|恵|裕子|愛|真由美|由美|麻衣|
美穂|愛美|彩".Split('
static string[] _last = "佐藤|鈴木|高橋|田中|伊藤|山本|渡辺|中村|
小林|加藤|吉田|山田|佐々木|山口|松本|井上|木村|斎藤|林|清水|山崎|
阿部|森|池田|橋本|山下|石川|中島|前田|藤田".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
}
}
|
|

