読者です 読者をやめる 読者になる 読者になる

しばやん雑記

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

WPF

WPF を使って動画のサムネイルを生成してみた

WPF

かなり久しぶりに WPF を使って動画からサムネイルを作ってみるコードを書いてみました。最初は MediaElement を作って、そのまま RenderTargetBitmap にレンダリングすれば良いかなと思ったんですが、それだと MediaElement 自体の描画が行われないみたいな…

WPF 4 の罠に引っかかった

WPF

ええ、またですよ。今日で 1.5 差し替えと 1.51 公開とかやっちゃいましたよ・・・。本当にごめんなさい。WPF4 ではテキストスタックが新しくなり、その時に TextOptions クラスが追加されて 3 つの添付プロパティが追加されました。今回はその中でも TextRe…

WPF 4.0 のテキスト表示

WPF

.NET 4.0 ベータ 2 が公開されたので、早速インストールして WPF Text Blog にあった挙動を確認していました。 Text clarity improvementsIn previous versions of WPF, all text is formatted without specifically accounting for pixel boundaries. This …

Application.Exit が信用できない

WPF

MiniTwitter は Application.Exit イベントで設定の保存をしてるんですが、どうも最近ユーザーさんが増えてきた関係か設定の保存に失敗するという Tweet を目にするように。どうも Windows Update での再起動やシャットダウン時に MiniTwitter が起動しっぱ…

M-V-VM を勉強中

WPF

とりあえず、自分がなるほど!と思った部分。いやぁ、よく出来てますね。 DelegateCommand と CommandReference DelegateCommand って何のためにあるの?と思ってたんですが、WPF に用意されている RoutedCommand や RoutedUICommand は VisualTree に属して…

ObservableCollection のソート

WPF

Sort メソッドが無いですが、慌てずに CollectionView.SortDescriptions を使いましょう。*1元のコレクションを変更せずにソート、グルーピング、フィルタリングが出来ますよ。最近このキーワードでの検索が多いので書いておきます。 *1:WPF で使う場合のみ

WPF メモ (28)

WPF

ObservableCollection<T> がコンストラクタで List<T> しか取らないことに不満だったんですが、.NET 3.5 SP1 で IEnumerable<T> を取るコンストラクタが追加されていました。ObservableCollection(T) Constructor (IEnumerable(T)) (System.Collections.ObjectModel)L</t></t></t>…

WPF メモ (27)

WPF

FrameworkElement.OverridesDefaultStyle を True にするとデフォルトスタイルが適用されないので、環境に依存することなく同じ表示を実現することができる。のかなぁ?Template を指定していないのに OverridesDefaultStyle = True にすると何も表示されな…

WPF メモ (26)

WPF

便利そうな添付プロパティをメモメモ。 Keyboard.FocusedElement キーボードフォーカスを持つエレメントを取得する KeyboardNavigation.TabIndex そのまんまタブで飛ぶ順番を定義 KeyboardNavigation.IsTabStop タブでの移動対象になるかどうか FocusManager…

定義済みコマンドまとめ

WPF

WPF で最初から定義されているコマンドを整理してみる。 System.Windows.Input 名前空間 ApplicationCommands Open や Save など一般的なアプリケーションで有用なコマンドを持つ ComponentCommands ちょっと特殊。あまり使う機会はないんじゃなかろうか Med…

WPF メモ (25)

WPF

データバインディングの作成で Path を指定せずに ElementName だけを指定すると、そのエレメントのインスタンスをバインドすることができるらしい。

負荷テスト中

WPF

以前のバージョンではタイムラインの項目が多くなると非常に重くなる問題があったんですが、今回の 1.00 + WPF 3.5 SP1 は軽快に動いてくれています。 VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"…

HLSL メモ

WPF

WPF 3.5 SP1 でシェーダを試したいので、今更ながら勉強しようかと。DirectX 9 High Level Shading Language 入門HLSL を使った上位レベルでのプログラミングA Series on GPU-based Effects for WPF - Greg Schechter's Blog - Site Home - MSDN Blogs追記シ…

BindingGroup を使ってみた

WPF

WPF 3.5 SP1 で追加された BindingGroup を使ってみました。以下サンプルコード。 C# using System.ComponentModel; using System.Windows; using System.Windows.Data; namespace WpfApplication1 { public partial class Window1 : Window { public Window…

WPF 3.5 SP1 メモ

WPF

弄ってみて気になった点をメモメモ。 StringFormat はターゲットプロパティが string の時だけ動く つまり ToolTip には使えない FrameworkElement.ToolTip を隠してやったwww ToolTip に TextBlock を突っ込めば使える BindingBase.StringFormat 以外に…

WPF メモ (24)

WPF

複数のリソースディクショナリを 1 つのリソースディクショナリとして扱うには ResourceDictionary.MergedDictionaries を使う。 <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Common.xaml"/> </ResourceDictionary.MergedDictionaries> <Style TargetType="{x:Type Button}"> </resourcedictionary>

WPF と Main メソッド

WPF

普通に Visual Studio で WPF アプリケーションを開発しようとすると、App.xaml が自動的に作成されて Main メソッドを定義する必要が無くなります。しかし、Main メソッドに付ける必要がある属性*1が使えなくなるので、App.xaml を使わずに Main メソッドを…

WPF とスレッド

WPF

MiniTwitter のタイムライン取得処理を別スレッドで動かすために、方法を改めて調べてみる。 普通に Thread を使う ちょっと捻って ThreadPool を使う スレッドの優先度を設定できない? BackgroundWorker を使う 別スレッドから UI を操作するには Dispatch…

WPF メモ (23)

WPF

TabControl にコレクションをバインドするときには TabControl.ItemTemplate と TabControl.ContentTemplate を使えばおっけー。 <TabControl x:Name="tabControl"> <TabControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Name}"/> </DataTemplate> </TabControl.ItemTemplate> <TabControl.ContentTemplate> <DataTemplate> </datatemplate></tabcontrol.contenttemplate></tabcontrol>

WPF メモ (22)

WPF

XAML で定義したブラシリソースなどは勝手にフリーズ状態になる。FindResource で引っ張ってきたブラシの IsFrozen を調べたら true になってました。Freezable については MSDN に詳しく載ってます。参考 : Freezable オブジェクトの概要

ほぼ縞模様用だと思う

WPF

id:Yamaki:20080623:1214197217 よりWPF 3.5 SP1 Feature: Alternating Rows - Vincent Sibal's Blog - Site Home - MSDN Blogs.NET 3.5 SP1 Beta の時にそれっぽいことが書いてあったので気になってたんですが、ItemsControl に新しいプロパティを追加する…

StringFormat がやってくる

WPF

Lester's WPF blog : WPF 3.5 SP1 feature: StringFormat3.5 SP1 でデータバインディングでの書式指定サポートが追加されるとありましたが、上記のブログでちょっと詳しい説明を見つけたのでメモしておきます。今は仕方なくコンバータを使って同じことを Min…

ListBox とグループ化

WPF

WPF の ListBox でグループ表示するときには ListBox.GroupStyle を指定しないとグループ名が表示されないらしい。 <ListBox> <ListBox.Resources> <DataTemplate x:Key="GroupHeaderTemplate"> <TextBlock Text="{Binding Path=Name}"/> </DataTemplate> </ListBox.Resources> <ListBox.GroupStyle> </listbox.groupstyle></listbox>

WPF メモ (21)

WPF

テキストボックスで IME のオンオフを切り替えるには InputMethod.IsInputMethodEnabled アタッチプロパティを使う。インテリセンスだけで探すことができたので便利でした。Application.LoadComponent は実行時に Assembly.LoadFrom で読み込まれたアセンブ…

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 はコントロール自体の配置を決めるためのもの。