イントレ。
Tag for "WPF"
プログラミングメモ。
WPFメモ。
◆ Windowのウィンドウハンドルが欲しいとき。
class Window1 : Window
{
// Window.Loadedイベント以降じゃないとハンドルが取れない
var helper = new WindowInteropHelper(this);
IntPtr handle = helper.Handle; // コレ
}
覚えていたはずだったのに、ド忘れして探すのに苦労…。
WPFメモ。
◆ Windowのウィンドウハンドルが欲しいとき。
class Window1 : Window
{
// Window.Loadedイベント以降じゃないとハンドルが取れない
var helper = new WindowInteropHelper(this);
IntPtr handle = helper.Handle; // コレ
}
覚えていたはずだったのに、ド忘れして探すのに苦労…。
プログラミングメモ。
DirectShowで再生出来て、MediaElement(MediaPlayerクラス含む)で再生出来ない件。
WPFのMediaElementには不思議な問題があります。
フィルタが正常にインストールされていて、DirectShowでは再生可能なのに、
MediaElementを利用すると、「ダウンロードに失敗」「オープンに失敗」「開けたけど再生出来ない」…など。
WindowsMediaPlayerでも、正常に再生出来ることが確認出来るんですが…
というところで気づきました。

WMPでファイルを開くときに、未知の拡張子だと「このコンテンツを再生しますか?」という確認が出る。
(ここでは、お試しのためにmp3ファイルをmp5という拡張子にリネームして実験しました。)
ここで、「今後、この拡張子の再生について確認しない」にチェックを付け、
WindowsMediaPlayerから無確認でファイルが再生出来るようになると、
MediaElementでもちゃんと再生出来るようになるようです。
この拡張子の再生許可なんですが、レジストリの以下の部分に記述されているようです。
HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Player\Extensions
そういえば、WMP11のベータ版をインストールしたときに、
WMP10との互換性問題が原因でWPFでもメディアが再生出来ないという問題がありましたが、
WPFとWMPって凄く依存しているんですね…。
フィルタがあるのに、WMPで再生許可(orレジストリを勝手に操作)しないと、
再生出来ないメディアがあるというのは、ちょっと問題なんじゃないのかなぁ…。
oggファイルなんかも普通に引っかかりますしねぇ…。
DirectShowで再生出来て、MediaElement(MediaPlayerクラス含む)で再生出来ない件。
WPFのMediaElementには不思議な問題があります。
フィルタが正常にインストールされていて、DirectShowでは再生可能なのに、
MediaElementを利用すると、「ダウンロードに失敗」「オープンに失敗」「開けたけど再生出来ない」…など。
WindowsMediaPlayerでも、正常に再生出来ることが確認出来るんですが…
というところで気づきました。

WMPでファイルを開くときに、未知の拡張子だと「このコンテンツを再生しますか?」という確認が出る。
(ここでは、お試しのためにmp3ファイルをmp5という拡張子にリネームして実験しました。)
ここで、「今後、この拡張子の再生について確認しない」にチェックを付け、
WindowsMediaPlayerから無確認でファイルが再生出来るようになると、
MediaElementでもちゃんと再生出来るようになるようです。
この拡張子の再生許可なんですが、レジストリの以下の部分に記述されているようです。
HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Player\Extensions
そういえば、WMP11のベータ版をインストールしたときに、
WMP10との互換性問題が原因でWPFでもメディアが再生出来ないという問題がありましたが、
WPFとWMPって凄く依存しているんですね…。
フィルタがあるのに、WMPで再生許可(orレジストリを勝手に操作)しないと、
再生出来ないメディアがあるというのは、ちょっと問題なんじゃないのかなぁ…。
oggファイルなんかも普通に引っかかりますしねぇ…。
プログラミングメモ。
DependencyPropertyの値が変更を知りたい。
趣旨。
・DependencyPropertyには値通知機能がある。
・バインディングでどのDependencyPropertyからでも変更を関知している。
・「~Changed」みたいなイベントが用意されてなくても、どうにかなるハズ。
…で、全うにやるならメタデータのオーバーライドでやるべきなんでしょうけど、
デザイナ向けにDependencyPropertyDescriptorクラスが公開されています。
これが簡単に利用出来て便利みたいです。
// クラス構造はこんな感じだったとして
class Foo : DependencyObject
{
DependencyProperty HogeProperty = ...;
...
}
DependencyPropertyDescriptor dpd =
DependencyPropertyDescriptor.FromProperty(HogeProperty, typeof(Foo));
dpd.AddValueChanged(...); // 値が変更されたときに呼び出されるデリゲートの登録
DependencyObject周りはやっぱりややこしい…。
DependencyPropertyの値が変更を知りたい。
趣旨。
・DependencyPropertyには値通知機能がある。
・バインディングでどのDependencyPropertyからでも変更を関知している。
・「~Changed」みたいなイベントが用意されてなくても、どうにかなるハズ。
…で、全うにやるならメタデータのオーバーライドでやるべきなんでしょうけど、
デザイナ向けにDependencyPropertyDescriptorクラスが公開されています。
これが簡単に利用出来て便利みたいです。
// クラス構造はこんな感じだったとして
class Foo : DependencyObject
{
DependencyProperty HogeProperty = ...;
...
}
DependencyPropertyDescriptor dpd =
DependencyPropertyDescriptor.FromProperty(HogeProperty, typeof(Foo));
dpd.AddValueChanged(...); // 値が変更されたときに呼び出されるデリゲートの登録
DependencyObject周りはやっぱりややこしい…。
WPFサーフェイスにWin32描画を行ってしまう WPF Win32 Renderer
ネタ元のブログにも書いていますが、
Win32ウィンドウの内容がそのままWPF上のイメージとして取り込まれています。
WPFのイメージというのはテクスチャ扱いみたいな物なので、ポリゴンに貼り付けたり出来ると…と。
PrintWindow APIでウィンドウ内容を取り込んで、やっているみたいです。
また、3DToolsとマウスフックを使うことで、
キーボードとマウス入力を対象のウィンドウにリダイレクトしています。
ちょっと反応が悪いんですが、ちゃんと操作できます。
フレームレートは低いには低いのですが、
ニコニコ動画が多少処理落ちして見れるレベルであると言っておきます。
XPでも、あんまり気になるレベルではないです。

実は以前、WPF上でDirect3Dを使えないかと、
似たようなことをやったことがあったんですが、
遅いし、メモリ喰いまくりだし…と、全然駄目じゃんって感じだったんですよね。
なので、こんな速度で動くのは信じられないんですが、
ソースコードを見ると、PresentationCore.dll内のInternalクラスを直で呼び出しとかしてます。
呼び出せるのかよ?! って感じでショックだったんですが。
この辺、よーく調べる必要がありそうです。
85,000Hitメモ。
ネタ元のブログにも書いていますが、
Win32ウィンドウの内容がそのままWPF上のイメージとして取り込まれています。
WPFのイメージというのはテクスチャ扱いみたいな物なので、ポリゴンに貼り付けたり出来ると…と。
PrintWindow APIでウィンドウ内容を取り込んで、やっているみたいです。
また、3DToolsとマウスフックを使うことで、
キーボードとマウス入力を対象のウィンドウにリダイレクトしています。
ちょっと反応が悪いんですが、ちゃんと操作できます。
フレームレートは低いには低いのですが、
ニコニコ動画が多少処理落ちして見れるレベルであると言っておきます。
XPでも、あんまり気になるレベルではないです。

実は以前、WPF上でDirect3Dを使えないかと、
似たようなことをやったことがあったんですが、
遅いし、メモリ喰いまくりだし…と、全然駄目じゃんって感じだったんですよね。
なので、こんな速度で動くのは信じられないんですが、
ソースコードを見ると、PresentationCore.dll内のInternalクラスを直で呼び出しとかしてます。
呼び出せるのかよ?! って感じでショックだったんですが。
この辺、よーく調べる必要がありそうです。
85,000Hitメモ。
プログラミングメモ。
WPFのデータバインディング。
WPFの強力な仕様にデータバインディングというものがあります。
これは、プロパティ同士の値を同期させられる便利なものです。
よくあるものとしては、
テキストボックスの値(TextBox.Textプロパティ)と、
アプリケーションが用意するデータクラスのstring型プロパティを連結するというもの。
ユーザー側から、テキストボックスからテキストを変更しても、
プログラム側から、データクラスのプロパティを変更しても、
お互いのデータは同じように変更され、同期されます。
なお、バインディングする際、
ソース側(バインディングする側)はCLRプロパティ(従来のプロパティ)やDependencyPropertyが利用できますが、
ターゲット側(バインディングされる方)はDependencyPropertyである必要があります。
バインディングには、バインディングモードというものがあります。
値を同期するモードと考えれば楽です。
・Default
DependencyPropertyのデフォルト値を使うモード。
テキストボックスやチェックボックスなどはTwoWay、そのほかはOneWayが普通。
プログラム側からデフォルト値を参考するにはPropertMetaDataを参照する。
・OneTime
最初の一度だけバインディングするモード。
・OneWay
Sourceの変更を検出してTargetを更新する。
SourceがCLRプロパティの場合は、INotifyPropertyChangedを実装する必要がある。
(そうしないと変更を関知できない)
・OneWayToSource
Targetの変更を検出してSourceを更新するモード。
OneWayの逆方向バージョン。
・TwoWay
SourceとTarget、両方の変更を検出して更新するモード。
こちらも、SourceがCLRプロパティの場合はINotifyPropertyChangedが必要。
だいたいはデフォルトで使ってても問題ないですけどね。
WPFのデータバインディング。
WPFの強力な仕様にデータバインディングというものがあります。
これは、プロパティ同士の値を同期させられる便利なものです。
よくあるものとしては、
テキストボックスの値(TextBox.Textプロパティ)と、
アプリケーションが用意するデータクラスのstring型プロパティを連結するというもの。
ユーザー側から、テキストボックスからテキストを変更しても、
プログラム側から、データクラスのプロパティを変更しても、
お互いのデータは同じように変更され、同期されます。
なお、バインディングする際、
ソース側(バインディングする側)はCLRプロパティ(従来のプロパティ)やDependencyPropertyが利用できますが、
ターゲット側(バインディングされる方)はDependencyPropertyである必要があります。
バインディングには、バインディングモードというものがあります。
値を同期するモードと考えれば楽です。
・Default
DependencyPropertyのデフォルト値を使うモード。
テキストボックスやチェックボックスなどはTwoWay、そのほかはOneWayが普通。
プログラム側からデフォルト値を参考するにはPropertMetaDataを参照する。
・OneTime
最初の一度だけバインディングするモード。
・OneWay
Sourceの変更を検出してTargetを更新する。
SourceがCLRプロパティの場合は、INotifyPropertyChangedを実装する必要がある。
(そうしないと変更を関知できない)
・OneWayToSource
Targetの変更を検出してSourceを更新するモード。
OneWayの逆方向バージョン。
・TwoWay
SourceとTarget、両方の変更を検出して更新するモード。
こちらも、SourceがCLRプロパティの場合はINotifyPropertyChangedが必要。
だいたいはデフォルトで使ってても問題ないですけどね。
Utilities
- タグ
- カレンダー
- 最近の更新
- Adsense