SlideShare a Scribd company logo
1 of 50
Download to read offline
Road toUI Library 
2014/11/29 Room metro #28Manato KAMEYA (@Grabacr07)
Subject 
•UI Library 作ってました 
−MetroRadiance(最近弄ってない…) 
−UserControl/ CustomControlの使いどころ共有 デモ& ライブコーディング中心 
•UI Library によって 
−コントロール/ UI 資産の再利用性を高める 
−アプリのブランド化 
あたりに興味を持って頂けると!
Agenda 
デスクトップアプリがこの先 生きのこるには 
Introduction 
CustomControl 
UserControl 
Conclusion 
Road to UI Library
•内容は個人に帰属します 所属する組織を代表するものではありません
Introduction
Self Introduction 
•Work 
−株式会社グラニ 
−Unity + C# でゲーム開発、まれにWPF 
•Private activity 
−Web: http://grabacr.net/ 
−Twitter: @Grabacr07(ぐらばく) 
−めとべや東京勉強会スタッフ 
−Microsoft MVP for Visual C#(2014/04 ~)
KanColleViewer 
•Windows Desktop app 
−.NET Framework 4.5 
−Visual C# + WPF 
•艦これプレイングツール Internet Explorer Shell + FiddlerCore 
•2013/12 公開(約11 ヶ月) 
−1,650,000 downloads 
−Azure の料金がやゔぁい!
KanColleViewer 
•常にエゴサーチ(twitter) 
−メンタル鍛えられます 
•ユーザーの反応 
−機能に対する反応・要望 
−UI に対する反応・要望 
•デベロッパーの反応 
−「この見た目どうやって作んの」 
UI ライブラリ自作しました
UI Libraries 
•最近のリッチなデスクトップアプリ
MetroRadiance 
•WPF カスタムコントロールライブラリ 
−カスタムコントロール&スタイル群 
−別アプリでも同じ外観を再現できる ライブラリ(アセンブリ) を参照し、App.xamlのResourceDictionaryでマージするだけ 
−自分で作ってるアプリのブランド化 社内向けツールとかも <ResourceDictionary.MergedDictionaries> <ResourceDictionarySource="pack://application:,,,/MyControlLibrary;component/Styles/Controls.xaml" /> <ResourceDictionarySource="pack://application:,,,/MyControlLibrary;component/Styles/Icons.xaml" /> <ResourceDictionarySource="pack://application:,,,/MyControlLibrary;component/Themes/Dark.xaml" /> <ResourceDictionarySource="pack://application:,,,/MyControlLibrary;component/Themes/Accents/Purple.xaml" /> </ResourceDictionary.MergedDictionaries>
UI Libraries 
•最近のリッチなデスクトップアプリ 
JetBrains社のインストーラー 
•独自Style のコントロール群 
•標準Chrome なし 
•Dark っぽいテーマ 
•進行状況不定バー(WinRTのアレ) <ProgressBarIsIndeterminate="True"> 
•ウィンドウの枠が光る 
•ウィンドウの枠が光る
Elysium 
•お手軽モダンUI ライブラリ これ使うだけでそれっぽく見える 
−http://elysium.codeplex.com/ 
−Zune 風コントロール・スタイル群 再現度はあまり高くない… 
−Visual Studio 2010 or 2012 が必要
Elysium 
•お手軽モダンUI ライブラリ これ使うだけでそれっぽく見える 
−http://elysium.codeplex.com/ 
−Zune 風コントロール・スタイル群 再現度はあまり高くない… 
−インストーラーに弾かれる VS2010 or 2012 が必要って言われる 
−独自のトースト通知システム Windows 7 でも通知できるが…
MahApps.Metro 
•お手軽モダンUI ライブラリ これ使うだけでそれっぽく見える 
−http://mahapps.com/MahApps.Metro/ 
−Windows ストアアプリ風 コントロール・スタイル群 
−割とおすすめ
のちょっとした話? 
Template
Visual Structure (default Controls) 
•既存コントロールの構造を知るには 
−既定のテンプレートを生成
Another Controls 
ここにあるコントロールがすべて… 
なわけはない
Another Controls 
右クリック> アイテムの選択 
…で、表示するコントロールを選べる
Another Controls 
System.Windows.Controls.Primitives名前空間 
RepeatButton, Popup, …
まずはオリジナルのコントロールの作成 
User Control
Original Control 
•NumericUpDown 
−WPF にない鉄板コントロールということでひとつ 
−ボタンが押しにくく、 使い勝手悪くなりがち 
…を、今ここで実際に作ってみましょう(!) 
要件 
•ユーザーによるテキスト入力 
•ボタン(値+1) 
•ボタン(値-1)
Case 1: User Control
Case 1: User Control 
•csproj> 追加> ユーザーコントロール 
•NumericUpDown.xaml
Case 1: User Control 
•csproj> 追加> ユーザーコントロール 
•NumericUpDown.xaml 
<DockPanel> 
<StackPanelDockPanel.Dock="Right"> 
<ButtonContent="▲" 
Click="CountUp" /> 
<ButtonContent="▼" 
Click="CountDown" /> 
</StackPanel> 
<TextBoxText="{BindingElementName=Root,Path=Value,Mode=TwoWay}" /> 
</DockPanel>
•csproj> 追加> ユーザーコントロール 
•NumericUpDown.xaml.cs(UserControlからの派生) 
publicintValue 
{ 
get{return(int)GetValue(ValueProperty);} 
set{SetValue(ValueProperty,value);} 
} 
publicstaticreadonlyDependencyPropertyValueProperty= 
DependencyProperty.Register("Value",typeof(int),typeof(NumericUpDown),newPropertyMetadata(0)); 
privatevoidCountUp(objectsender,RoutedEventArgse) 
{ 
this.Value++; 
} 
Case1: UserControl 
依存関係プロパティ
Case 1: User Control 
•完成!… と、思うじゃろ? 
−そのときしか使わない場合は、それで完成。 
−他のプロジェクトでも使い回したい場合は…? そして、他のプロジェクトでは外観を変更したい場合は…? 
次のアプリでも使うよ 
ただしボタンをデカくしてくれ 
大変申し訳ございません早急に 影響調査し対応致しますので今 暫くお待ち頂きますよう宜しk
Feature of User Control 
•UserControl型からの派生 
−アプリケーション構築と同じ方法で作れる 
▫Window / Page を作成するのと同じ要領で、ポトペタ開発 
▫既存のコンポーネントだけで構成されている 
−複雑なカスタマイズをサポートしない Background やBorderBrushを外部から指定する、程度の簡単なカスタマイズはでちる しかし、DataTemplateやControlTemplateによる外部からのカスタマイズはできない
外観をカスタマイズできるコントロールの作成 
Custom Control
Case 2: Custom Control
Case 2: Custom Control 
•csproj> 追加> 新しい項目> WPF> カスタムコントロール (Universal apps の場合は「テンプレートコントロール」) 
−NumericUpDown2.cs 
−Themes/Generic.xaml 
<StyleTargetType="{x:Typelocal:NumericUpDown2}"> 
<SetterProperty="Template"> 
<Setter.Value> 
<ControlTemplateTargetType="{x:Typelocal:NumericUpDown2}"> 
<BorderBackground="{TemplateBindingBackground}" 
BorderBrush="{TemplateBindingBorderBrush}" 
BorderThickness="{TemplateBindingBorderThickness}"> 
</Border> 
</ControlTemplate> 
</Setter.Value> 
</Setter> 
</Style> 
操作ロジック(コントロールの機能の実装) 
視覚的表現(コントロールの外観の実装) 
NumericUpDown2 は 
どうやって外観の定義まで 
辿り着くか?
Feature of Custom Control 
•Control 型からの派生 
−ロジックと外観の完全な分離 
▫コントロールの振る舞いを、ロジック(.cs) に 
▫コントロールの外観を、Style/Template(Generic.xaml) に 
−.NET Framework が提供するコントロールと同じ実装 
−コントロールの外観をカスタマイズ可能 ControlTemplateにより、あらゆる外観に設定可能
Parts and States Model 
•視覚的な構造と動作はControlTemplateで定義 
−外観を直接ロジックで書くのはダメゼッタイ 
−NumericUpDownの場合 
負の値のときは 
文字を赤くしたい… 
TextBoxのForeground を 
SolidColorBrushのRed に…
Parts and States Model 
•視覚的な構造と動作はControlTemplateで定義 
−外観を直接ロジックで書くのはダメゼッタイ 
−NumericUpDownの場合 
負の値のときは 
文字を赤くしたい… 
TextBoxのForeground を 
SolidColorBrushのRed に… 
ValueStates 
•Positive 
•Negative 
正負をVisualStateで保持 
負の値でどうなるか、は 
ControlTemplateで自由に実装
Parts and States Model 
•ControlTemplateとロジックの接点 
−コントロールの要件(命題) を満たすうえで必要なパーツ 
−NumericUpDownの場合 
▫Click イベントを購読するため、ロジックから参照しなければならない 
Value を増減させるためのButton が必ず必要 
名前付きパーツとOnApplyTemplateメソッド
Parts and States Model 
•名前付きパーツ 
−例えば、System.Windows.Controls.ComboBoxの場合 http://msdn.microsoft.com/ja-jp/library/ms752094.aspx
Parts and States Model 
•名前付きパーツ 
−例えば、System.Windows.Controls.ComboBoxの場合 http://msdn.microsoft.com/ja-jp/library/ms752094.aspx 
<Gridx:Name="templateRoot" 
SnapsToDevicePixels="true"> 
<!--中略--> 
<Popupx:Name="PART_Popup" 
AllowsTransparency="true" 
Grid.ColumnSpan="2" 
IsOpen="{BindingIsDropDownOpen,RelativeSource={RelativeSourceTemplatedParent}}" 
PopupAnimation="{DynamicResource{x:StaticSystemParameters.ComboBoxPopupAnimationKey}}" 
Placement="Bottom"> 
<!--中略--> 
<Borderx:Name="border" 
Background="{StaticResourceTextBox.Static.Background}" 
Margin="{TemplateBindingBorderThickness}"> 
<TextBoxx:Name="PART_EditableTextBox" 
HorizontalContentAlignment="{TemplateBindingHorizontalContentAlignment}" 
IsReadOnly="{BindingIsReadOnly,RelativeSource={RelativeSourceTemplatedParent}}" 
Margin="{TemplateBindingPadding}" 
Style="{StaticResourceComboBoxEditableTextBox}" 
VerticalContentAlignment="{TemplateBindingVerticalContentAlignment}" /> 
</Border> 
</Grid> 
ComboBoxのControlTemplate(default)
Parts and States Model 
•OnApplyTemplateメソッド 
−ControlTemplateのVisual Tree が構築されたとき実行される ロジックからControlTemplateの実装にアクセスできる最も早いタイミング 
•GetTemplateChildメソッド 
−ControlTemplate内の名前付き要素を返す ControlTemplate内にある名前付きパーツのインスタンスを取得できる!
Parts and States Model 
•コントロールコントラクト 
−ロジックが使用する視覚的要素 名前付きパーツ 
−視覚的に作用するpublic PropertyNumericUpDownでいうValue プロパティなど 
−コントロールの状態とグループ VisualStates/ VisualStatesGroup
Parts and States Model 
•コントロールコントラクト 
−ロジックが使用する視覚的要素 名前付きパーツ 
−視覚的に作用するpublic PropertyNumericUpDownでいうValue プロパティなど 
−コントロールの状態とグループ VisualStates/ VisualStatesGroup 
[TemplatePart(Name = "PART_UpButton", Type = typeof(Button))] 
[TemplatePart(Name = "PART_DownButton", Type = typeof(Button))] 
publicclassCustomControl1: Control 
{ 
privateButtonupButton; 
privateButtondownButton; 
publicoverridevoidOnApplyTemplate() 
{ 
base.OnApplyTemplate(); 
this.upButton= this.GetTemplateChild("PART_UpButton") asButton; 
if(this.upButton!= null) 
{ 
this.upButton.Click+= (sender, e) => this.Value++; 
} 
// 以下略
Custom Control 
•リソースを検索する順序 
1.要素レベル 参照する要素からルート要素まで辿って検索 
2.アプリケーションレベル Application (App.xaml) 内で定義されたリソース 
3.テーマレベル Themes フォルダー内。つまりGeneric.xamlLuna.NormalColor.xamlとか使わんし…
Custom Control 
•リソースを検索する順序 
1.要素レベル 参照する要素からルート要素まで辿って検索 
2.アプリケーションレベル Application (App.xaml) 内で定義されたリソース 
3.テーマレベル Themes フォルダー内。つまりGeneric.xamlLuna.NormalColor.xamlとか使わんし… 
<UserControl> 
<Grid> 
<StackPanel> 
<Border> 
<local:NumericUpDown/> 
</Border> 
</StackPanel> 
</Grid> 
</UserControl> 
NumericUpDown.Resources、 
Border.Resources、StackPanel.Resources、 
Grid.Resources、… の順に検索
Custom Control 
•リソースを検索する順序 
1.要素レベル 参照する要素からルート要素まで辿って検索 
2.アプリケーションレベル Application (App.xaml) 内で定義されたリソース 
3.テーマレベル Themes フォルダー内。つまりGeneric.xamlLuna.NormalColor.xamlとか使わんし… 
<Applicaton> 
<Appliction.Resources> 
<!--ここにあるやつ--> 
</Appliction.Resources> 
</Applicaton> 
※ただしアプリケーションのみ ライブラリ(.dll) はApplication を 
持たないので
Custom Control 
•リソースを検索する順序 
1.要素レベル 参照する要素からルート要素まで辿って検索 
2.アプリケーションレベル Application (App.xaml) 内で定義されたリソース 
3.テーマレベル Themes フォルダー内。つまりGeneric.xamlLuna.NormalColor.xamlとか使わんし…
DependentUpon-Generic.xaml 
•Generic.xaml、だいたい溢れる カスタムコントロールが増えてくると、保守たいへん 
−なので、Generic.<CustomControlName>.xamlに分離して DependentUponすると良さげ 
.csproj手動編集はつらすぎるので、拡張機能「VSCommands」とかとか
Without creating a new control 
•新しいコントロールを自作しないための方法 作らないで済むならそれに越したことはなく。 
CircleButton、とか作りたくなってくるが… 
マウスオーバーと 
クリック時に 
全体の色を変える… 
円と矢印、 
押しやすいように 
Margin 広めで… 
Dark テーマに 
対応…
Without creating a new control 
•新しいコントロールを自作しないための方法 作らないで済むならそれに越したことはなく。 
CircleButton、とか作りたくなってくるが… 
マウスオーバーと 
クリック時に 
全体の色を変える… 
円と矢印、 
押しやすいように 
Margin 広めで… 
<Button> 
<Grid> 
<Ellipse/> 
<PathData=""/> 
</Grid> 
</Button> 
Button + リッチコンテンツ+ Style で実現可能 カスタムコントロールを作る必要は、ない 
Dark テーマに 
対応…
Find the best possible choice 
•コントロールの価値命題 
−こそが重要 
−外観ではなく、コントロールの原理/ 振る舞い XAML Platform では、外観はいくらでも作り込めるので、一切関係ない 
TabControl 
ListBox 
ItemsControl 
見た目は同じでも、要件が異なるので、それぞれ違うコントロールをベースにしている
Road to UI Library 
•作ったコントロールの再利用性を高めるために 
−UserControlはワンオフの実装、その時だけに使える 
−CustomControlは、WPF などと同じコントロールの実装 
−再利用性を見込んで、の実装となると 断然カスタムコントロール(テンプレートコントロール)
Conclusion
Advent Calendar 
•XAML Advent Calendar 2014http://qiita.com/advent-calendar/2014/xaml 
•ご参加頂きたく。

More Related Content

Viewers also liked

20140905_学びと向き合うフィンランドの図書館
20140905_学びと向き合うフィンランドの図書館20140905_学びと向き合うフィンランドの図書館
20140905_学びと向き合うフィンランドの図書館Hiroyuki Chiba
 
Learn The Library!
Learn The Library!Learn The Library!
Learn The Library!Carolyn Argo
 
Library orientation
Library orientationLibrary orientation
Library orientationJanecatalla
 
0528 kanntigai ui_ux
0528 kanntigai ui_ux0528 kanntigai ui_ux
0528 kanntigai ui_uxSaori Matsui
 
女子の心をつかむUIデザインポイント - MERY編 -
女子の心をつかむUIデザインポイント - MERY編 -女子の心をつかむUIデザインポイント - MERY編 -
女子の心をつかむUIデザインポイント - MERY編 -Shoko Tanaka
 
見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版MOCKS | Yuta Morishige
 

Viewers also liked (7)

20140905_学びと向き合うフィンランドの図書館
20140905_学びと向き合うフィンランドの図書館20140905_学びと向き合うフィンランドの図書館
20140905_学びと向き合うフィンランドの図書館
 
Learn The Library!
Learn The Library!Learn The Library!
Learn The Library!
 
Library Orientation
Library OrientationLibrary Orientation
Library Orientation
 
Library orientation
Library orientationLibrary orientation
Library orientation
 
0528 kanntigai ui_ux
0528 kanntigai ui_ux0528 kanntigai ui_ux
0528 kanntigai ui_ux
 
女子の心をつかむUIデザインポイント - MERY編 -
女子の心をつかむUIデザインポイント - MERY編 -女子の心をつかむUIデザインポイント - MERY編 -
女子の心をつかむUIデザインポイント - MERY編 -
 
見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版
 

Similar to Road to UI Library

GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社Game Tools & Middleware Forum
 
JPAの基礎と現場で役立つ開発Tips
JPAの基礎と現場で役立つ開発TipsJPAの基礎と現場で役立つ開発Tips
JPAの基礎と現場で役立つ開発Tipsyuichi_kuwahara
 
React+redux+saga 02
React+redux+saga 02React+redux+saga 02
React+redux+saga 02TIS Inc
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料OCHI Shuji
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼうyouku
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】Tomoharu ASAMI
 
Jqm20120210
Jqm20120210Jqm20120210
Jqm20120210cmtomoda
 
それではBehaviorでも使ってみましょうか。
それではBehaviorでも使ってみましょうか。それではBehaviorでも使ってみましょうか。
それではBehaviorでも使ってみましょうか。Hiroyuki Mori
 
How to django at first
How to django at firstHow to django at first
How to django at firstMaito Kuwahara
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会Jumpei Ogawa
 
React を導入した フロントエンド開発
React を導入したフロントエンド開発React を導入したフロントエンド開発
React を導入した フロントエンド開発 daisuke-a-matsui
 
Windows ストアアプリのつくりかた (JS + HTML + CSS)
Windows ストアアプリのつくりかた (JS + HTML + CSS)Windows ストアアプリのつくりかた (JS + HTML + CSS)
Windows ストアアプリのつくりかた (JS + HTML + CSS)Yu Nobuoka
 
最高のツイッタークライアントを求めて
最高のツイッタークライアントを求めて最高のツイッタークライアントを求めて
最高のツイッタークライアントを求めてairtoxin Ishii
 
Introduction for Browser Side MVC
Introduction for Browser Side MVCIntroduction for Browser Side MVC
Introduction for Browser Side MVCRyunosuke SATO
 

Similar to Road to UI Library (20)

GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
 
JPAの基礎と現場で役立つ開発Tips
JPAの基礎と現場で役立つ開発TipsJPAの基礎と現場で役立つ開発Tips
JPAの基礎と現場で役立つ開発Tips
 
React+redux+saga 02
React+redux+saga 02React+redux+saga 02
React+redux+saga 02
 
お客様が望んでいるモダンデスクトップアプリとは?/傾向と対策 Part1
お客様が望んでいるモダンデスクトップアプリとは?/傾向と対策 Part1お客様が望んでいるモダンデスクトップアプリとは?/傾向と対策 Part1
お客様が望んでいるモダンデスクトップアプリとは?/傾向と対策 Part1
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
 
Titanium勉強会
Titanium勉強会Titanium勉強会
Titanium勉強会
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
Jqm20120210
Jqm20120210Jqm20120210
Jqm20120210
 
それではBehaviorでも使ってみましょうか。
それではBehaviorでも使ってみましょうか。それではBehaviorでも使ってみましょうか。
それではBehaviorでも使ってみましょうか。
 
How to django at first
How to django at firstHow to django at first
How to django at first
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
Visualforce + jQuery
Visualforce + jQueryVisualforce + jQuery
Visualforce + jQuery
 
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
QML を用いた YouTube クライアントの作成 - 関東 Qt 勉強会
 
2013 Ignite UI 最新情報 in 岡山
2013 Ignite UI 最新情報 in 岡山2013 Ignite UI 最新情報 in 岡山
2013 Ignite UI 最新情報 in 岡山
 
React を導入した フロントエンド開発
React を導入したフロントエンド開発React を導入したフロントエンド開発
React を導入した フロントエンド開発
 
Windows ストアアプリのつくりかた (JS + HTML + CSS)
Windows ストアアプリのつくりかた (JS + HTML + CSS)Windows ストアアプリのつくりかた (JS + HTML + CSS)
Windows ストアアプリのつくりかた (JS + HTML + CSS)
 
最高のツイッタークライアントを求めて
最高のツイッタークライアントを求めて最高のツイッタークライアントを求めて
最高のツイッタークライアントを求めて
 
Introduction for Browser Side MVC
Introduction for Browser Side MVCIntroduction for Browser Side MVC
Introduction for Browser Side MVC
 

Recently uploaded

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 

Recently uploaded (10)

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 

Road to UI Library

  • 1. Road toUI Library 2014/11/29 Room metro #28Manato KAMEYA (@Grabacr07)
  • 2. Subject •UI Library 作ってました −MetroRadiance(最近弄ってない…) −UserControl/ CustomControlの使いどころ共有 デモ& ライブコーディング中心 •UI Library によって −コントロール/ UI 資産の再利用性を高める −アプリのブランド化 あたりに興味を持って頂けると!
  • 3. Agenda デスクトップアプリがこの先 生きのこるには Introduction CustomControl UserControl Conclusion Road to UI Library
  • 6. Self Introduction •Work −株式会社グラニ −Unity + C# でゲーム開発、まれにWPF •Private activity −Web: http://grabacr.net/ −Twitter: @Grabacr07(ぐらばく) −めとべや東京勉強会スタッフ −Microsoft MVP for Visual C#(2014/04 ~)
  • 7. KanColleViewer •Windows Desktop app −.NET Framework 4.5 −Visual C# + WPF •艦これプレイングツール Internet Explorer Shell + FiddlerCore •2013/12 公開(約11 ヶ月) −1,650,000 downloads −Azure の料金がやゔぁい!
  • 8. KanColleViewer •常にエゴサーチ(twitter) −メンタル鍛えられます •ユーザーの反応 −機能に対する反応・要望 −UI に対する反応・要望 •デベロッパーの反応 −「この見た目どうやって作んの」 UI ライブラリ自作しました
  • 10. MetroRadiance •WPF カスタムコントロールライブラリ −カスタムコントロール&スタイル群 −別アプリでも同じ外観を再現できる ライブラリ(アセンブリ) を参照し、App.xamlのResourceDictionaryでマージするだけ −自分で作ってるアプリのブランド化 社内向けツールとかも <ResourceDictionary.MergedDictionaries> <ResourceDictionarySource="pack://application:,,,/MyControlLibrary;component/Styles/Controls.xaml" /> <ResourceDictionarySource="pack://application:,,,/MyControlLibrary;component/Styles/Icons.xaml" /> <ResourceDictionarySource="pack://application:,,,/MyControlLibrary;component/Themes/Dark.xaml" /> <ResourceDictionarySource="pack://application:,,,/MyControlLibrary;component/Themes/Accents/Purple.xaml" /> </ResourceDictionary.MergedDictionaries>
  • 11. UI Libraries •最近のリッチなデスクトップアプリ JetBrains社のインストーラー •独自Style のコントロール群 •標準Chrome なし •Dark っぽいテーマ •進行状況不定バー(WinRTのアレ) <ProgressBarIsIndeterminate="True"> •ウィンドウの枠が光る •ウィンドウの枠が光る
  • 12. Elysium •お手軽モダンUI ライブラリ これ使うだけでそれっぽく見える −http://elysium.codeplex.com/ −Zune 風コントロール・スタイル群 再現度はあまり高くない… −Visual Studio 2010 or 2012 が必要
  • 13. Elysium •お手軽モダンUI ライブラリ これ使うだけでそれっぽく見える −http://elysium.codeplex.com/ −Zune 風コントロール・スタイル群 再現度はあまり高くない… −インストーラーに弾かれる VS2010 or 2012 が必要って言われる −独自のトースト通知システム Windows 7 でも通知できるが…
  • 14. MahApps.Metro •お手軽モダンUI ライブラリ これ使うだけでそれっぽく見える −http://mahapps.com/MahApps.Metro/ −Windows ストアアプリ風 コントロール・スタイル群 −割とおすすめ
  • 16. Visual Structure (default Controls) •既存コントロールの構造を知るには −既定のテンプレートを生成
  • 18. Another Controls 右クリック> アイテムの選択 …で、表示するコントロールを選べる
  • 21. Original Control •NumericUpDown −WPF にない鉄板コントロールということでひとつ −ボタンが押しにくく、 使い勝手悪くなりがち …を、今ここで実際に作ってみましょう(!) 要件 •ユーザーによるテキスト入力 •ボタン(値+1) •ボタン(値-1)
  • 22. Case 1: User Control
  • 23. Case 1: User Control •csproj> 追加> ユーザーコントロール •NumericUpDown.xaml
  • 24. Case 1: User Control •csproj> 追加> ユーザーコントロール •NumericUpDown.xaml <DockPanel> <StackPanelDockPanel.Dock="Right"> <ButtonContent="▲" Click="CountUp" /> <ButtonContent="▼" Click="CountDown" /> </StackPanel> <TextBoxText="{BindingElementName=Root,Path=Value,Mode=TwoWay}" /> </DockPanel>
  • 25. •csproj> 追加> ユーザーコントロール •NumericUpDown.xaml.cs(UserControlからの派生) publicintValue { get{return(int)GetValue(ValueProperty);} set{SetValue(ValueProperty,value);} } publicstaticreadonlyDependencyPropertyValueProperty= DependencyProperty.Register("Value",typeof(int),typeof(NumericUpDown),newPropertyMetadata(0)); privatevoidCountUp(objectsender,RoutedEventArgse) { this.Value++; } Case1: UserControl 依存関係プロパティ
  • 26. Case 1: User Control •完成!… と、思うじゃろ? −そのときしか使わない場合は、それで完成。 −他のプロジェクトでも使い回したい場合は…? そして、他のプロジェクトでは外観を変更したい場合は…? 次のアプリでも使うよ ただしボタンをデカくしてくれ 大変申し訳ございません早急に 影響調査し対応致しますので今 暫くお待ち頂きますよう宜しk
  • 27. Feature of User Control •UserControl型からの派生 −アプリケーション構築と同じ方法で作れる ▫Window / Page を作成するのと同じ要領で、ポトペタ開発 ▫既存のコンポーネントだけで構成されている −複雑なカスタマイズをサポートしない Background やBorderBrushを外部から指定する、程度の簡単なカスタマイズはでちる しかし、DataTemplateやControlTemplateによる外部からのカスタマイズはできない
  • 29. Case 2: Custom Control
  • 30. Case 2: Custom Control •csproj> 追加> 新しい項目> WPF> カスタムコントロール (Universal apps の場合は「テンプレートコントロール」) −NumericUpDown2.cs −Themes/Generic.xaml <StyleTargetType="{x:Typelocal:NumericUpDown2}"> <SetterProperty="Template"> <Setter.Value> <ControlTemplateTargetType="{x:Typelocal:NumericUpDown2}"> <BorderBackground="{TemplateBindingBackground}" BorderBrush="{TemplateBindingBorderBrush}" BorderThickness="{TemplateBindingBorderThickness}"> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> 操作ロジック(コントロールの機能の実装) 視覚的表現(コントロールの外観の実装) NumericUpDown2 は どうやって外観の定義まで 辿り着くか?
  • 31. Feature of Custom Control •Control 型からの派生 −ロジックと外観の完全な分離 ▫コントロールの振る舞いを、ロジック(.cs) に ▫コントロールの外観を、Style/Template(Generic.xaml) に −.NET Framework が提供するコントロールと同じ実装 −コントロールの外観をカスタマイズ可能 ControlTemplateにより、あらゆる外観に設定可能
  • 32. Parts and States Model •視覚的な構造と動作はControlTemplateで定義 −外観を直接ロジックで書くのはダメゼッタイ −NumericUpDownの場合 負の値のときは 文字を赤くしたい… TextBoxのForeground を SolidColorBrushのRed に…
  • 33. Parts and States Model •視覚的な構造と動作はControlTemplateで定義 −外観を直接ロジックで書くのはダメゼッタイ −NumericUpDownの場合 負の値のときは 文字を赤くしたい… TextBoxのForeground を SolidColorBrushのRed に… ValueStates •Positive •Negative 正負をVisualStateで保持 負の値でどうなるか、は ControlTemplateで自由に実装
  • 34. Parts and States Model •ControlTemplateとロジックの接点 −コントロールの要件(命題) を満たすうえで必要なパーツ −NumericUpDownの場合 ▫Click イベントを購読するため、ロジックから参照しなければならない Value を増減させるためのButton が必ず必要 名前付きパーツとOnApplyTemplateメソッド
  • 35. Parts and States Model •名前付きパーツ −例えば、System.Windows.Controls.ComboBoxの場合 http://msdn.microsoft.com/ja-jp/library/ms752094.aspx
  • 36. Parts and States Model •名前付きパーツ −例えば、System.Windows.Controls.ComboBoxの場合 http://msdn.microsoft.com/ja-jp/library/ms752094.aspx <Gridx:Name="templateRoot" SnapsToDevicePixels="true"> <!--中略--> <Popupx:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="{BindingIsDropDownOpen,RelativeSource={RelativeSourceTemplatedParent}}" PopupAnimation="{DynamicResource{x:StaticSystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom"> <!--中略--> <Borderx:Name="border" Background="{StaticResourceTextBox.Static.Background}" Margin="{TemplateBindingBorderThickness}"> <TextBoxx:Name="PART_EditableTextBox" HorizontalContentAlignment="{TemplateBindingHorizontalContentAlignment}" IsReadOnly="{BindingIsReadOnly,RelativeSource={RelativeSourceTemplatedParent}}" Margin="{TemplateBindingPadding}" Style="{StaticResourceComboBoxEditableTextBox}" VerticalContentAlignment="{TemplateBindingVerticalContentAlignment}" /> </Border> </Grid> ComboBoxのControlTemplate(default)
  • 37. Parts and States Model •OnApplyTemplateメソッド −ControlTemplateのVisual Tree が構築されたとき実行される ロジックからControlTemplateの実装にアクセスできる最も早いタイミング •GetTemplateChildメソッド −ControlTemplate内の名前付き要素を返す ControlTemplate内にある名前付きパーツのインスタンスを取得できる!
  • 38. Parts and States Model •コントロールコントラクト −ロジックが使用する視覚的要素 名前付きパーツ −視覚的に作用するpublic PropertyNumericUpDownでいうValue プロパティなど −コントロールの状態とグループ VisualStates/ VisualStatesGroup
  • 39. Parts and States Model •コントロールコントラクト −ロジックが使用する視覚的要素 名前付きパーツ −視覚的に作用するpublic PropertyNumericUpDownでいうValue プロパティなど −コントロールの状態とグループ VisualStates/ VisualStatesGroup [TemplatePart(Name = "PART_UpButton", Type = typeof(Button))] [TemplatePart(Name = "PART_DownButton", Type = typeof(Button))] publicclassCustomControl1: Control { privateButtonupButton; privateButtondownButton; publicoverridevoidOnApplyTemplate() { base.OnApplyTemplate(); this.upButton= this.GetTemplateChild("PART_UpButton") asButton; if(this.upButton!= null) { this.upButton.Click+= (sender, e) => this.Value++; } // 以下略
  • 40. Custom Control •リソースを検索する順序 1.要素レベル 参照する要素からルート要素まで辿って検索 2.アプリケーションレベル Application (App.xaml) 内で定義されたリソース 3.テーマレベル Themes フォルダー内。つまりGeneric.xamlLuna.NormalColor.xamlとか使わんし…
  • 41. Custom Control •リソースを検索する順序 1.要素レベル 参照する要素からルート要素まで辿って検索 2.アプリケーションレベル Application (App.xaml) 内で定義されたリソース 3.テーマレベル Themes フォルダー内。つまりGeneric.xamlLuna.NormalColor.xamlとか使わんし… <UserControl> <Grid> <StackPanel> <Border> <local:NumericUpDown/> </Border> </StackPanel> </Grid> </UserControl> NumericUpDown.Resources、 Border.Resources、StackPanel.Resources、 Grid.Resources、… の順に検索
  • 42. Custom Control •リソースを検索する順序 1.要素レベル 参照する要素からルート要素まで辿って検索 2.アプリケーションレベル Application (App.xaml) 内で定義されたリソース 3.テーマレベル Themes フォルダー内。つまりGeneric.xamlLuna.NormalColor.xamlとか使わんし… <Applicaton> <Appliction.Resources> <!--ここにあるやつ--> </Appliction.Resources> </Applicaton> ※ただしアプリケーションのみ ライブラリ(.dll) はApplication を 持たないので
  • 43. Custom Control •リソースを検索する順序 1.要素レベル 参照する要素からルート要素まで辿って検索 2.アプリケーションレベル Application (App.xaml) 内で定義されたリソース 3.テーマレベル Themes フォルダー内。つまりGeneric.xamlLuna.NormalColor.xamlとか使わんし…
  • 44. DependentUpon-Generic.xaml •Generic.xaml、だいたい溢れる カスタムコントロールが増えてくると、保守たいへん −なので、Generic.<CustomControlName>.xamlに分離して DependentUponすると良さげ .csproj手動編集はつらすぎるので、拡張機能「VSCommands」とかとか
  • 45. Without creating a new control •新しいコントロールを自作しないための方法 作らないで済むならそれに越したことはなく。 CircleButton、とか作りたくなってくるが… マウスオーバーと クリック時に 全体の色を変える… 円と矢印、 押しやすいように Margin 広めで… Dark テーマに 対応…
  • 46. Without creating a new control •新しいコントロールを自作しないための方法 作らないで済むならそれに越したことはなく。 CircleButton、とか作りたくなってくるが… マウスオーバーと クリック時に 全体の色を変える… 円と矢印、 押しやすいように Margin 広めで… <Button> <Grid> <Ellipse/> <PathData=""/> </Grid> </Button> Button + リッチコンテンツ+ Style で実現可能 カスタムコントロールを作る必要は、ない Dark テーマに 対応…
  • 47. Find the best possible choice •コントロールの価値命題 −こそが重要 −外観ではなく、コントロールの原理/ 振る舞い XAML Platform では、外観はいくらでも作り込めるので、一切関係ない TabControl ListBox ItemsControl 見た目は同じでも、要件が異なるので、それぞれ違うコントロールをベースにしている
  • 48. Road to UI Library •作ったコントロールの再利用性を高めるために −UserControlはワンオフの実装、その時だけに使える −CustomControlは、WPF などと同じコントロールの実装 −再利用性を見込んで、の実装となると 断然カスタムコントロール(テンプレートコントロール)
  • 50. Advent Calendar •XAML Advent Calendar 2014http://qiita.com/advent-calendar/2014/xaml •ご参加頂きたく。