WPF reference note
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
__________________________________________________________________________________
## DataContext
WPF、怒りのツリー外DataContext伝播
https://qiita.com/ugaya40/items/58e9e3c3340cc1f61b4f
FrameworkElementに親子関係があればDataContextが継承される。親のDataContextが変われば子のDataContextも自動で変わる。
この機能のおかげでXAMLの記述量少なくできている。
(GridにしかDataContextを設定していないが、Buttonにも同じDataContextが継承されているので、バインドができる)
この機能は基本的に「VisualTree(LogicalTreeの方かもしんない)上で親子関係があるFrameworkElement同士」でしか機能しない。
(FrameworkElementじゃないとそもそもDataContextプロパティが無い。)
## FrameworkElement.DataContext プロパティ
https://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.datacontext(v=vs.110).aspx
要素がデータ バインディングに含まれている場合に、その要素のデータ コンテキストを取得または設定します。
__________________________________________________________________________________
## バックグラウンド スレッドで UI 要素を作るとメモリリークする (WPF)Add Star
http://grabacr.net/archives/1851
### Freezable Class
Defines an object that has a modifiable state and a read-only (frozen) state.
* Freeze()
現在のオブジェクトを変更不可能にし、その IsFrozen プロパティを true に設定します。
ImageSource は Freezable なので、バックグラウンドで画像を作って Freeze() してしまえば、UI スレッドに渡してもだいじょうぶ。
なるべく UI スレッドの負担を減らしたいのです。
Console.WriteLine("Total Memory = {0} KB", GC.GetTotalMemory(true) / 1024);
## ImageSource クラス
BitmapSource と DrawingImage など幅、高さ、および ImageMetadata を持つオブジェクト型を表します。 これは抽象クラスです。
要は、WPFで利用されている画像オブジェクト。
WinFormsでは、System.Drawing.Bitmap
__________________________________________________________________________________
## System.ServiceModel.Web
チュートリアル : ASP.NET アプリケーション サービスの使用
https://msdn.microsoft.com/ja-jp/library/bb515342(v=vs.100).aspx
__________________________________________________________________________________
## CustomDataGrid
https://social.msdn.microsoft.com/Forums/ja-JP/e9909a42-ce31-4b1f-9443-d5fa77c76a77/datagridenter?forum=silvelightdotnetja
自前でDataGridを継承したCustomDataGridを定義できる。
(例)
public class CustomDataGrid : DataGrid
{
public CustomDataGrid() : base()
{
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
this.MoveNextCell();
e.Handled = true;
};
base.OnKeyDown(e);
}
private void MoveNextCell()
{
DataGridColumn currentcol = this.CurrentColumn;
// 現在のカラムが最大かどうか
bool isLastCol = (currentcol.DisplayIndex == this.Columns.Count - 1);
if (!isLastCol)
{
// 編集を終了して次へ
this.CommitEdit();
this.CurrentColumn = this.Columns[currentcol.DisplayIndex + 1];
this.BeginEdit();
};
}
}
__________________________________________________________________________________