しばやん雑記

ASP.NET Core とメイドさんが大好きなフリーランスのプログラマーのブログ

WPF

WPF メモ (20)

WPF

ある DependencyObject を持つ Window を取得したい場合は Window.GetWindow を使う。ウィンドウのフックに使いたい場合は HwndSource.FromVisual とかを使ったほうが楽だけど。HwndSource.FromVisual は PresentationSource を返すけど、単純にキャストすれ…

ListBox でダブルクリック

WPF

WPF の ListBox には Click/DoubleClick イベントが存在せず、MouseDoubleClick などしか存在していません。MouseDoubleClick を使えばいいと思いますが、これだと項目以外の場所をダブルクリックしたときにもイベントが呼ばれてしまいます。 検索するとThe …

WPF メモ (19)

WPF

ListBox.ContextMenu に ContextMenu を突っ込むと、各要素*1が ContextMenu の DataContext に入るみたいです。これに気がつかなかったので、前までは ListBoxItem.ContextMenu にスタイルで指定してたんですが、そんな面倒なことしなくてもよかったみたい…

ローカライズは難しい

WPF

前にも何回か書いてますが、WinForm の時と違って WPF のローカライズはなんだか難しいです。XAML で定義している分には LocBaml を使えばサテライトアセンブリを作れるんですが、コード中に埋め込んでいる文字列リテラルはどうしようかなぁと。 XAML 中に S…

コレクションビューとか

WPF

現時点では MiniTwitter のタイムライン表示は ObservableCollection に突っ込む前に List に突っ込んで、それから日付順でソートさせたりしている。しかし WPF には CollectionView という便利なものが存在しているようです。 CollectionView クラスを使え…

WPF メモ (18)

WPF

ListBox の項目を必ず見える位置にスクロールしたいときには ScrollIntoView メソッドを使う。ItemsSource にコレクションを突っ込んでる場合は、そのコレクション内のオブジェクトを指定すればおっけー。暗黙的に作成されたコンテナを指定してもいけるのか…

WPF の多言語化

WPF

川西 裕幸のブログ : LocBAML で紹介されている方法を試してみました。ターゲットは MiniTwitter です。とりあえず UICulture を指定して、msbuild を使って x:Uid を自動的に追加してもらいます。XAML に対して行われるので、リソースディクショナリにも自…

メニューの置き換え

WPF

WPF の TextBox はコンテキストメニューに「切り取り」「コピー」「貼り付け」の 3 つしかないので、ContextMenu プロパティを置き換えることで拡張してみた。 <ContextMenu x:Key="TextBoxMenu"> <MenuItem Header="元に戻す(_U)" Command="ApplicationCommands.Undo"/> <Separator/> <MenuItem Header="切り取り(_T)" Command="ApplicationCommands.Cut"/> </menuitem></separator/></menuitem></contextmenu>

お手軽に音を鳴らす

WPF

MiniTwitter に新着受信時に音を鳴らす機能を付けるのには System.Media 名前空間の SoundPlayer クラスを使いました。WAVE 限定ですが、普通こんな用途には WAVE ぐらいしか使わないので十分です。 SoundPlayer player = new SoundPlayer(@"C:\Windows\Medi…

WPF メモ (17)

WPF

方法 : ListView の行の背景色を変更するを見て MiniTwitter のタイムライン周りを書き換えたわけですが、コンテナからその親を引っ張ってきて、さらにはインデックスまで取れるというのに驚きました。キーは ItemsControl.ItemsControlFromItemContainer と…

WPF メモ (16)

WPF

ScrollViewer.CanContentScroll は物理スクロールと論理スクロールを切り替えるために使う。物理スクロールはピクセル単位でスクロールするのに対し、論理スクロールは項目単位でスクロールする。ListBox で ScrollViewer.CanContentScroll = False とすると…

WPF メモ (15)

WPF

ItemsSource にコレクションをバインディングしたときに、コントロールの Items プロパティを弄ると例外が投げられます。ItemsSource にバインディングしているコレクションに対して操作しないと駄目です。すっかり ItemsSource にバインディングしているこ…

WPF メモ (14)

WPF

Silder コントロールのつまみを Tick の位置に合わせたい場合は IsSnapToTickEnabled = True とすればよい。出来ないものだと思ってめちゃくちゃ迷ってました……。IsSnapToTickEnabled = True とすれば Value を整数にするときなど便利かもしれません。SmallC…

WPF メモ (13)

WPF

BitmapImage で読み込んだファイルは、その BitmapImage のインスタンスが残ってる限りロックされるっぽい。便利なような不便なような……。

WPF メモ (12)

WPF

Window.RestoreBounds を使えば最小化・最大化前のウィンドウの位置、サイズを取得できる。地味だけど何かと便利なプロパティ。あまり関係ないけど、Rect や Point も Parse メソッドを持ってるんだねぇ……。知らなかった。 追記 Geometry も Parse メソッド…

WPF メモ (11)

WPF

ColorConverter を使えば #AARRGGBB 形式を Color クラスのインスタンスに変換できる。おそらく XAML で使われている型コンバータ。 Color color = ColorConverter.ConvertFromString("#3399FF"); と変換はらくらく。

WPF メモ (10)

WPF

バブル型イベントをキャンセルする方法。キャンセルというか、途中で打ち切るというか。 XAML <Window MouseDoubleClick="Window_MouseDoubleClick"> <Canvas> <Button Click="Button_Click">Click Me!</Button> </Canvas> </Window> C# private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e) { // 何らかの処理 } private void Button_Click(objec…

WPF メモ (9)

WPF

MenuItem でチェックマークを付けたいなら IsCheckable = true とすると自動でトグル動作になる。イベントは Checked と Unchecked が用意されていて、名前の通り。今までは Click イベントでチェックマークを付けたりはずしたりしていましたが、WPF を使え…

WPF メモ (8)

WPF

StaticResource や Binding などのマークアップ拡張についてメモ。 StaticResource CLR プロパティと DependencyProperty の両方に使用することが出来る。実行時のリソース変更は出来ない。 DynamicResource DependencyProperty にのみ使用することが出来る…

オブジェクト初期化子を使う

ものすごく楽です、特にプロパティが多い WPF 周りですっきりと書けるのがうれしいところ。これは惚れます。 Window window = new Window { Title = "新しいウィンドウ", Width = 300, Height = 300 }; と書けるのですっきりしていい感じです、イベントも指…

WPF メモ (7)

WPF

Transparent はマウスイベントが発生するが、x:Null はマウスイベントは発生しない。 <Window> <ScrollViewer Background="Transparent"/> </Window> この場合だと ScrollViewer のマウスイベントは発生するが、Window のマウスイベントは発生しない。Window のプレビューイベントを使えば取れますが。Background = x:N…

WPF メモ (6)

WPF

Win32 仮想キーと System.Windows.Input.Key を相互変換するには System.Windows.Input.KeyInterop クラスを使うことで可能。 using System.Windows.Input; // Key -> Win32 仮想キー int virtualKey = KeyInterop.VirtualKeyFromKey(Key.Enter); // Win32 …

WPF とドラッグドロップ (2)

WPF

WinForm の時は DragEnter と DragDrop の 2つのイベントハンドラを書いてましたが、WPF の場合は DragEnter ではなく DragOver を使う必要があるっぽいです。例えば DragEnter でドロップされたテキストやファイルの確認をして、ドラッグの可否を判別するコ…

EventTrigger の使い道

WPF

EventTrigger の子に出来るのは、今のところ BeginStoryboard ControllableStoryboardAction SoundPlayerAction のクラスらしく、ほとんどアニメーション専用といってもいい気がする。ちなみに SoundPlayerAction は WPF 3.5 で追加されたクラスだったはず。…

WPF メモ (5)

WPF

その1 TreeView で ItemsSource を使ってバインディングするときには、HierarchicalDataTemplate を使ってデータテンプレートを定義すればいいらしい。TreeView に限らず、HeaderedItemsControl なら使えるらしいのでメニューにも使えそうですが未確認です。…

WPF メモ (4)

WPF

コントロールのコンテンツの配置を指定するには、HorizontalContentAlignment や VerticalContentAlignment を使う。HorizontalAlignment や VerticalAlignment はコントロール自体の配置を決めるためのもの。

最近 WPF ネタが多いな

WPF

ダイアログ ボックスの概要WPF でのダイアログについていろいろ書いてあるページを発見したのでメモ。 <Button IsDefault="True">OK</Button> <Button IsCancel="True">キャンセル</Button> WinForm では Form 自体に AcceptButton と CancelButton プロパティがあって、それにボタンを直接指定してやる形式だったのが…

WPF とアイコン2

WPF

id:shiba-yan:20070908:1189245291 ImageSource をアイコンハンドルに変換するには、CreateIconIndirect などの API を使うしかないらしい。System.Drawing.dll を参照してるなら、Icon クラスを使えばいいっぽい。

WPF メモ (3)

WPF

System.Windows.Shapes 名前空間にある Rectangle や Polygon はマウスなど各種イベントを受け取れる。よくよく見てみると UIElement を継承してるから、当たり前と言っちゃ当たり前。Stroke や StrokeDashArray といったプロパティを使えば、簡単に周囲を点…

非矩形なウィンドウの作り方をメモした

WPF

非矩形のウィンドウの作り方メモ。 WPF System.Windows.Window に AllowsTransparency = True, WindowStyle = None, Background = Transparent を指定する。 Windows Forms GraphicsPath とか Win32 の SetWindowRgn や UpdateLayeredWindow を使う。 Cocoa …