AvalonDockその2
2013年6月27日
AvalonDockはNuGetで入れなくても、WPF Toolkit入れればインストールされるようだ。
ついでに、リボンUIにした。
VS2012だとリボンアプリのテンプレートが無いみたいなので、VS2010で作ってコピペした。
ドキュメント表示するタブは、AvalonDockで管理する。
メイン画面のXAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<avalonDock:DockingManager x:Name="dockingManager" Grid.Row="1"> <avalonDock:LayoutRoot> <avalonDock:LayoutPanel Orientation="Vertical"> <avalonDock:LayoutPanel Orientation="Horizontal"> <avalonDock:LayoutDocumentPane> </avalonDock:LayoutDocumentPane> <avalonDock:LayoutAnchorablePane DockWidth="150"> <avalonDock:LayoutAnchorable Title="プロパティ"> <xctk:PropertyGrid x:Name="_propertyGrid" Width="Auto" DataContext="{Binding}" AutoGenerateProperties="True"> </xctk:PropertyGrid> </avalonDock:LayoutAnchorable> </avalonDock:LayoutAnchorablePane> </avalonDock:LayoutPanel> <avalonDock:LayoutAnchorablePane DockHeight="100"> <avalonDock:LayoutAnchorable Title="出力"> <TextBox/> </avalonDock:LayoutAnchorable> </avalonDock:LayoutAnchorablePane> </avalonDock:LayoutPanel> </avalonDock:LayoutRoot> </avalonDock:DockingManager> |
<avalonDock:LayoutDocumentPane>のところにドキュメントが表示されるので、画面を追加してLyaoutDocumentに改造。
1 2 3 4 5 6 7 8 9 10 11 12 |
using Xceed.Wpf.AvalonDock.Layout; namespace FFFE { /// <summary> /// MyDocument.xaml の相互作用ロジック /// </summary> public partial class MyDocument : LayoutDocument { public MyDocument() { InitializeComponent(); } |
しかし、デザイナで表示できない?ので、
ローカルコントロールを作って、貼り付けることにした。
ドキュメントのXAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<avalonDock:LayoutDocument x:Class="FFFE.MyDocument" xmlns:avalonDock="http://schemas.xceed.com/wpf/xaml/avalondock" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:FFFE" mc:Ignorable="d" Title="MyDocument" Closing="LayoutDocument_Closing"> <Grid> <local:UserControl1 Width="Auto" /> </Grid> </avalonDock:LayoutDocument> |
ローカル コントロール
ドキュメントの表示は、こんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private void MenuItem1_Click(object sender, RoutedEventArgs e) { var firstDocumentPane = dockingManager.Layout.Descendents().OfType<LayoutDocumentPane>().FirstOrDefault(); if (firstDocumentPane != null) { MyDocument doc = new MyDocument(); doc.Title = "Test1"; firstDocumentPane.Children.Add(doc); MyDocument doc2 = new MyDocument(); doc2.Title = "Test2"; firstDocumentPane.Children.Add(doc2); } |
内部的にドキュメント管理するのが大変かもな。。
このままコードビハインドに書いてくと汚くなるな。
MVVMにした方がいいのかな。