[ カテゴリー » PC関連 ]

WPF用ObservableCollection

以前WPFにバインディングされたObservableCollectionを他スレッドから操作すると例外になるLink 件で悩んだ以後、CollectionのAdd/Removeはせずに毎回Collectionを作り直すという消極策に出ていたのですが、今回どうやら避けて通れない事態に。View側でCollectionChangedイベント監視するの面倒だなぁと思ってたら、答えLink は意外にも簡単なところに。去年もうちょっとちゃんと調べればよかった。

なんとなくViewModel/ModelがViewの事情に譲歩しているような気もしますが、これくらいなら個人的には許容範囲。(UIスレッドのDispatcher得るためにViewとViewModelに細工しないといけないならやるか悩んだかも)

[2018/4/23 追記] .NET Framework 4.5以上ではBindingOperations.EnableCollectionSynchronizationLink を使ったほうが楽でしょう。私も場合、いまだにXPで動いている案件が有ったりするので…

using System.Collections.ObjectModel;
using System.Windows.Threading;

class DispatchedCollection<T> : ObservableCollection<T>
{
    Dispatcher uiDispatcher = System.Windows.Application.Current.Dispatcher;

    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (uiDispatcher.CheckAccess())
        {
            base.OnCollectionChanged(e);
        }
        else
        {
            uiDispatcher.Invoke(new Action(() => base.OnCollectionChanged(e)));
        }
    }
}

[参考] マルチスレッド環境下でのコレクションの操作 (かずきのBlog@Hatena)Link

— posted by mu at 06:53 pm  

WPF: StoryboardにBinding

DoubleAnimationとかでFrom, To, Durationなどを状況に応じて変更させるためにこれらにBindingを設定したいという状況は少なくないと思うのですが、ControlTemplate.TriggersやStyle.Triggers内で定義すると実行時に”Cannot freeze this Storyboard timeline tree for use across threads”なるメッセージの例外が出ます。

どうもはっきり理解できていないのですが、理由は以下のどちらかかな?
  • Animationやっている最中にFrom, To, Duration値が変えられると困る。なので少なくともStoryboard開始前にはこの値を固定(Freeze)する必要がある。値を動的に変えることが目的のBindingはこれに反する。
  • TemplateやStyleは使いまわされることが前提なので、事前(多分Exe実行初期)にXamlをコンパイルしてパフォーマンスを改善している。よってコンパイル後値が変わる要因となるBindingは認められない。

ここの例Link はStoryboardをリソース指定、開始をコードビハインドでやることで、うまく回避できているということでしょうか。Animation開始後にウィンドウサイズを変えてもボールの動きが追従しないので、Animation中は値が変えられないということがわかります。

コードビハインドで取得したリソースはDynamicResourceに相当するLink らしいので、Storyboardをリソースで指定してDynamicResourceで参照すればと試したのですが、少なくともControlTemplateではうまく行かず。

[参考]

[2013/3/18 追記] 結局プロパティの変化を捕まえて、毎回コードビハインドでStoryboardから作る方法で逃げた

Storyboard LastStoryboard;
double from, to;

void BeginHeightAnimation()
{
    if (LastStoryboard != null) LastStoryboard.Stop();

    ControlTemplate template = (ControlTemplate)GetValue(TemplateProperty);
    FrameworkElement target = (FrameworkElement)template.FindName("Target", this);
    DoubleAnimation dblAnim = new DoubleAnimation(from, to, new Duration(TimeSpan.FromMilliseconds(200)));
    Storyboard sb = new Storyboard();
    sb.Children.Add(dblAnim);
    Storyboard.SetTarget(dblAnim, target);
    Storyboard.SetTargetProperty(dblAnim, new PropertyPath(FrameworkElement.HeightProperty));

    sb.Begin();

    LastStoryboard = sb;
}

— posted by mu at 12:31 pm  

メモリ壊れた

blog20130315-BrokenSODIMM

やけにFirefoxが落ちたりBSoDが出るなと思ったら、メモリが壊れていた。何も海外で壊れなくてもと思ったけど、出張か帰省中にしか活躍しないノートだからそりゃ海外で壊れるか。

Knoppixが起動するUSBメモリとか、2枚入れてあったメモリカードとか、普段なら「無駄に良い」と言われそうな準備が役に立ち、特に困った事態にはならずに済みそう。

— posted by mu at 06:53 pm  

Lenovo A800 root化

中華フォント対策のためにLenovo A800をroot化したのでメモ。

  • ADB用ドライバはLenovoUsbDriverで検索する。バージョン1.0.1以降推奨。私はここLink から取りました(チェコ語のようです)
  • root化にはSRS One Click RootLink を使用。
    • 英語が読めると成功確率がグッと上がると思う、というか読めずにできるのだろうか?
    • root化するボタンは2つあります。私は上のボタン(全部試す)で成功。多分どっちでもいい。
    • 途中WindowsのOKボタンを押した直後にAndroidのResumeボタンを押せと出ますが、本当にすぐ押さないといけないようなので失敗したらもう一度。
  • フォントファイルの変更などはここLink の他色んな所に書いてあるのでお好きな方法で。
  • あとは好みでSuperuserとかBusyboxとか。

個人的にroot化すると、汚してしまったというか取り返しの付かないことしたような気分になる(^_^;)

[参考]

— posted by mu at 12:03 am   commentComment [0]  pingTrackBack [0]

Lenovo A800購入

blog20130311-LenovoA800

Nexus7を購入Link してから私のスマホ化が急激に進んでます。去年の今頃は「スマホ買っても使い道ないしなぁ」と言ってたような > 自分

先週から再びフィリピン出張。それまで定宿としていたホテルは室内インターネット使い放題だったのですが、今回来てみると3時間/日制限が入ってたorz で、ちょっと調べてみると携帯回線のデータ通信定額が予想外に安いLink ので代替になりそう。最初はUSB接続タイプLink を購入してWindows7にSoftAPを設定して使っていたのですが、なんかSoftAPがブツブツ切れるので安いテザリング用スマホが欲しくなってきた次第。

Dual SIM機がいいなってことでSony Xperia tipo dualLink が候補だったのですが、安いの探して店巡りしていたらLenovo A800Link を勧められて心変わり。とりあえず2日使ってみたところ…

  • バッテリーはSIM 2枚14時間待ち受け/数回メールチェック/1時間テザリングで残り75%と頼もしい限り。
  • いかんせん(^_^;) 中華パッド/スマホ。フィリピン販売なので初期設定は英語なものの、言語選択に日本語なし。ここLink 読んで気後れしていたのですが、なんてことはないGoogle Playが最初から使えるのでMoreLocation2とGoogle日本語入力を入れてあっさり解決
  • ただし日本語設定にしてもAndroid設定画面(標準の設定画面とは違うデザイン)や一部のプリインストールアプリは英語のまま
  • ストラップ通す穴がないのは意表を突かれた。中国人はストラップ使わないってことか。
  • 現在中華フォント対策にモトヤLマルベリ3等幅を入れる準備中

でかくて重いですが、コストパフォーマンスはかなりいいです。

で、パケット定額ですが、日中・夕方は40kbpsとかb-mobileの980円Link といい勝負の速度ですが、深夜になると1Mbpsを超えるようになり、夜間のぶっ通しダウンロードにかなり便利。

[2013/03/12 追記] ストラップの穴について会社の人に聞いてみたところ、中国人「珍しいな、普通ついてるんだが」 アメリカ人「今まで買った5台、どれも穴なんてなかったぞ」と予想の逆の返答でした。

[2013/03/13 追記] 日本語フォント入れるための第一歩であるADBドライバは、LenovoUsbDriverで検索。私の環境(Windows7 SP1 x64)ではバージョン1.0.1じゃないと認識してくれませんでした。私はここLink から取りましたが、何語だこのページ? 勘で乗り切りましょう(^_^)

— posted by mu at 10:51 pm  

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0262 sec.
prev
2026.2
next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28