PGP 公開鍵とメールアドレス

Xbox Friends

小物類

  • Webスカウター

    スカウター : YuO's weblog @ JUSTBLOG

  • あわせて読みたい

    あわせて読みたいブログパーツ

  • フィードメーター

    フィードメーター - YuO's weblog @ JUSTBLOG

WPF

2009年11月25日 (水)

twimemo: R流・WPFアプリケーション開発 @ わんくま同盟 東京勉強会 #40

わんくま同盟 東京勉強会 #40中でのセッション,R・田中一郎さんの「R流・WPFアプリケーション開発」で知ったこと。 なぜか元ネタが@nakawankumaさんだったりする不思議。 以下,Twitterでつぶやいたログ。

2009年4月 3日 (金)

WPFのデータバインドとマルチスレッド

WPFのプロパティにバインドしているプロパティを,別スレッドから弄ってみた。PropertyChangedイベントは別スレッド側で実行。結果は,

  • 通常のバインド:プロパティの取得は,UIスレッドで行われた
  • ICommand.CanExecuteChanged:イベントの実行は,別スレッド側で行われるために例外発生

でした。 なので,CanExecuteChangedイベントの呼び出し時のみ,Dispatcher経由が必要なようです。 System.Windows.Application.Current.Dispatcuer経由,ということになりそうです。


ちなみに,Windows Formsでは別スレッド側でプロパティ取得が行われます。 よって,PropertyChangedイベントをUIスレッドで実行する必要があります。

2009年3月29日 (日)

テキストボックスとInt32型のバインディング

M-V-VM関係の話をよく聞くのでテスト。

TextBoxふたつはっつけて,ボタンを押すと割り算の結果をTextBlockに表示するだけの簡単なプログラム。

あれ?intを直接バインドすると,"a"とかの時に,確認するすべがない……というのは困るのでさがしていると,八巻さん@グレープシティデブサミ資料を発見。 変換は,ViewModelでやるのか。なるほど。

やってると,Windows Formsアプリケーションとも共通化したくなりますが,ICommandインターフェースがWPFのものだし,いろいろ対応していないので断念。 ここらへんだけは,WinFormsでは手で書かないといけなさそうです。 でも,WinFormsでも,M-V-VMっぽいことはできそう。

2008年9月 8日 (月)

Connectにあげた

%入りのフォントはWPFで使えないの内容ですが,WPFとExpressionの両方にフィードバックしました。 あまりこれに引っかかる方はいないでしょうけれど,引っかかっている方 (一太郎をお使いの方など) は,是非ともVoteをお願いします。

2008年9月 2日 (火)

%入りのフォントはWPFで使えない

一太郎などに付いてくるフォントに,"%Century Oldstyle"というものがあります。 これを,WPFでFontFamilyに指定すると,System.UriがUriFormatExceptionを起こします。

%をUri用にエスケープして,"%25Century Oldstyle"としてやると,何事もなかったように通ります。 例外スタックを見る限り,Uri使ってキャッシュしているようです。


それはそうと,Expression Blendのフォントの指定,上記の理由から全て落ちます。 原因は,ほぼ%Century Oldstyleで確定なのですが……。

2008年6月19日 (木)

DataSetの更新とDataView

WPFでデータバインドさせていて,データが切り替わらないことで知ったのですが,DataViewの変更通知はそのViewの元になったTableの変更までに留まります。

当たり前そうに思えますが,RowFilterにParentやChildを使っていた場合に,変更が反映されず,RowFilterとViewの内容が不整合を起こしてしまいます。 とりあえず,解決策として,変更と同時に繋がっているテーブルの,繋がっているカラムの値を,自己代入してやることで変更を通知しています。 当然,無意味な代入なので,あとでUpdateする場合などにしっぺ返しがきますが……。

2008年6月13日 (金)

WPFでFolderBrowserDialogを呼び出す

WPFには,FolderBrowserDialogの代替になるものがありません。 というわけで,コード書いてみました。

using System;
using System.Windows.Forms;
using CommonDialog = Microsoft.Win32.CommonDialog;
using FolderBrowserDialogForms = System.Windows.Forms.FolderBrowserDialog;

public class FolderBrowserDialog : CommonDialog
{
    public string Description { get; set; }
    public Environment.SpecialFolder RootFolder { get; set; }
    public string SelectedPath { get; set; }
    public bool ShowNewFolderButton { get; set; }

    public FolderBrowserDialog ()
    {
        Reset();
    }

    public override void Reset ()
    {
        Description = String.Empty;
        RootFolder = Environment.SpecialFolder.Desktop;
        SelectedPath = String.Empty;
        ShowNewFolderButton = true;
    }

    private class Win32Window : IWin32Window
    {
        private IntPtr _handle;

        public Win32Window (IntPtr handle)
        {
            _handle = handle;
        }

        public IntPtr Handle
        {
            get
            {
                return _handle;
            }
        }
    }

    protected override bool RunDialog (IntPtr hwndOwner)
    {
        using (var fbd = new FolderBrowserDialogForms())
        {
            fbd.Description = Description;
            fbd.RootFolder = RootFolder;
            fbd.SelectedPath = SelectedPath;
            fbd.ShowNewFolderButton = ShowNewFolderButton;

            if (fbd.ShowDialog(new Win32Window(hwndOwner)) != DialogResult.OK)
            {
                return false;
            }

            SelectedPath = fbd.SelectedPath;
            return true;
        }
    }
}

ご利用は自己責任でご自由にどうぞ。