2010年12月09日

"ASSOCIATORS OF" on System.Management

HDDフォーマット形式の取得方法 - Insider .NET会議室 より。

回答にて ちなみに、WMI でドライブレターからそのパーティションを探すには、Win32_LogicalDiskToPartition を使用できます。.NET(System.Management)だと使いづらいんですが。 などと書いてしまったわけですが、単に私の勉強不足による誤解でした。

ある WMI クラスインスタンスに関連するクラスインスタンスを取得するのに、WQL で ASSOCIATORS OF クエリを使うことができます。C ドライブの Win32_DiskPartition を取得するにはこんな感じのクエリになります。見れば大体分かると思うので解説は略。

ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='C:'} WHERE
     ResultClass=Win32_DiskPartition AssocClass=Win32_LogicalDiskToPartition
     ResultRole=Antecedent Role=Dependent

上記はきわめて丁寧に書いた場合で、手を抜ききるとこんな感じになります。

ASSOCIATORS OF {Win32_LogicalDisk='C:'} WHERE ResultClass=Win32_DiskPartition

もちろん、System.Management でもこのクエリを使うことができます。ManagementObjectSearcher のコンストラクタに直接上記のクエリを渡すのが手っ取り早いでしょう。

クエリ構文が思いつかない、という場合、パラメータを渡すことで ASSOCIATORS OF クエリの構築を行ってくれる RelatedObjectQuery クラスも存在しています。このクラスを使った場合はこんな感じになります。

// 丁寧に書いた版
var query = new RelatedObjectQuery("Win32_LogicalDisk='C:'", "Win32_DiskPartition",
    "Win32_LogicalDiskToPartition", null, null, "Antecedent", "Dependent", false);
var searcher = new ManagementObjectSearcher(query);
// 省略版
var query = new RelatedObjectQuery("Win32_LogicalDisk='C:'", "Win32_DiskPartition");
posted by Hongliang at 21:25| Comment(10) | TrackBack(0) | .NET | このブログの読者になる | 更新情報をチェックする

2010年10月03日

ScrollIntoView(TextElement)

FlowDocumentScrollViewer には、直接スクロールを扱う機構が存在してないみたいです。テンプレート(またはビジュアルツリー)を漁れば ScrollViewer が手に入り、こちらを使えばスクロールを扱えます。

しかし、当然ながら ScrollViewer 自体は物理インクリメントによるスクロールのみのサポートであり、「このテキスト要素を表示したいんだけど」というのは直接的にはできません。

幸い、テキスト要素 TextElement が提供する TextPointer には、自分を表示しているビューア全体のどの範囲に表示されるかを表す GetCharacterRect メソッドが用意されています。

ということで、TextElement を引数に取る ScrollIntoView を実装してみましょう。FlowDocumentScrollViewer の派生クラスのメソッドとしておきますが、(拡張メソッドを含めた)静的メソッドとしても構いません。テンプレートが差し替えられていることまで考慮する場合、内部の ScrollViewer を取得するには VisualTreeHelper で子要素を辿っていくようにする必要があるでしょう。

public bool ScrollIntoView(TextElement element) {
  if (element == null)
    throw new ArgumentNullException("element");
  if (this.Document == null)
    return false;
  if (!this.Document.ContentStart.IsInSameDocument(element.ContentStart)
    return false;
  var contentHost = (ScrollViewer)this.Template.FindName("PART_ContentHost", this);
  if (contentHost == null)
    return false;
  var rect = element.ContentStart.GetCharacterRect(LogicalDirection.Backward);
  contentHost.ScrollToVerticalOffset(contentHost.VerticalOffset + rect.Top);
  // HorizontalOffset の方は取り敢えず略
  return true;
}
posted by Hongliang at 18:39| Comment(0) | TrackBack(0) | WPF | このブログの読者になる | 更新情報をチェックする

2010年09月01日

MenuItemとHierarchicalDataTemplate /WPF

前々回の続き。今回のテーマは、階層メニューです。前回でなく前々回なのは、今回は前回扱った動静混在メニューは置いておくからです。題材は引き続きブラウザのブックマーク。

この記事では、実際に URL を持っていてクリックすればそのページに飛べるのをブックマーク、複数のブックマークを子要素に持てるのをフォルダと呼ぶことにします。フォルダは子要素にブックマークの他にさらにフォルダを持つことも可能とします。

続きを読む
posted by Hongliang at 17:57| Comment(0) | TrackBack(0) | WPF | このブログの読者になる | 更新情報をチェックする

2010年08月31日

MenuItemとCompositeCollectionをバインド /WPF

前回 の続き。今回は固定メニューと動的メニューが混在しているケースを考えます。題材は前回に引き続きブラウザのブックマーク。

なお、次回 は今回とは独立した階層メニューの話です。

続きを読む
posted by Hongliang at 06:32| Comment(0) | TrackBack(0) | WPF | このブログの読者になる | 更新情報をチェックする

2010年08月27日

MenuItemをバインド /WPF

WPF の MenuItem をバンディングで表現してみようのコーナー。ブラウザのブックマークをサンプルにしてみます。

続きを読む
posted by Hongliang at 00:49| Comment(0) | TrackBack(0) | WPF | このブログの読者になる | 更新情報をチェックする

2010年05月04日

最大化ボタン最小化ボタン

WPF の Window クラスでは、WinForm における MaximizeBox/MinimizeBox プロパティは廃止され、代わりにResizeMode プロパティで賄われるようになっています。しかし ResizeMode 列挙体には CanMinimize はあっても CanMaximize はないため、最小化だけ禁止というのは実現できません。またウィンドウ境界線のドラッグによるリサイズ動作も兼ねるため、最大化ボタンは使えないけど自由なリサイズは許可したい、といった要求には応えられません。ResizeMode によるリサイズ機能関連のプロパティ一元化は方向として良いと思うんですが、柔軟性が犠牲になっているのは残念な物です。

リサイズは、最大化、最小化、ドラッグによるリサイズ、という三つの独立した機能が考えられます。独立しているんですから、それぞれ独立したプロパティにしてしまいましょう。依存関係プロパティにすればバインディングもできて便利です。

これらのリサイズ機能は Windows の機能に依存しています。具体的に言うとウィンドウスタイルの、WS_MAXIMIZEBOX、WS_MINIMIZEBOX、WS_SIZEBOX です。これらの設定は WinForm なら CreateParams をオーバーライドするだけで簡単に実装できたんですが、その辺をできるだけ隠蔽している WPF では面倒です。ウィンドウハンドルを取得して、Win32API の SetWindowLong 関数で後からスタイルを設定する必要があります。

ソースコード表示
posted by Hongliang at 04:22| Comment(0) | TrackBack(0) | WPF | このブログの読者になる | 更新情報をチェックする

ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。

ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。

あ、こんなのに使ったってコメントを頂ければ嬉しいです。

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。