【Visual Studio Online】TFS APIを利用してVisual Studio Onlineからソースを取得する。

  • 2014.05.08 Thursday
  • 08:14
JUGEMテーマ:コンピュータ

 最近のソース管理のはやりはGitHubっていうらしいですね。うん。よくわからん。Visual Studio 2013 にはデフォルトでローカルGitなるものが付属していて、私もちょちょちょ程度に触ってみてちょっちょっちょ〜〜って感動したんですが、今回はTFSのお話。数か月前からVisual Studio Onlineを利用させてもらっているのですが、これが実に便利でして、自分が書いたサンプルコードをクラウド上にあるTFSにソース管理させてもらっている次第です。いっぱいPCを持ってると、ソースがあっちゃこっちゃいってしまって困ってたんですが、Visual Studio Onlineというサービスを利用することで、大分、ストレスが軽減されました。
 それで、ふと思ったんですが、Visual Studio OnlineってAzure上に設置されているTFSだと聞いたことがあるんです。つまり、TFS APIって利用できるなじゃない??って思い立ちまして、試してみたのですが、見事にTFS APIでVisual Studio Onlineにアクセスすることができました。おー便利かもー。という事で今回は、アクセス方法と簡単なソースの取得方法をご紹介します。前置き長くてごめんなさい。

■参照を追加する。
・Microsoft.TeamFoundation.Client.dll
・Microsoft.TeamFoundation.VersionControl.Client.dll
を参照に追加します。場合によってはほかのも追加する必要がありますが、今回のコードではこれだけで十分です。

■コードを書く。

using System;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;

namespace Art55.TfsApi20140508_001
{
    class Program
    {
        static void Main(string[] args)
        {
            var teamCollectionUri = new Uri(@"https://XXXXXXXX.visualstudio.com/DefaultCollection");
            var teamCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(teamCollectionUri);

            // 前に認証されていない場合は Team Foundation Server につながりを認証します。
            teamCollection.EnsureAuthenticated();

            var versionControlService = teamCollection.GetService<VersionControlServer>();

            const string localProjectPath = @"c:/source/test";
            Workspace localWorkspace = versionControlService.TryGetWorkspace(localProjectPath);
            if (localWorkspace != null)
            {
                // すでに存在する場合は、削除する。
                localWorkspace.Delete();
            }

            string workspaceName = string.Format("{0}_{1}", Environment.MachineName, DateTime.Now.ToString("yyyyMMddHHmmssms"));
            const string serverProjectPath = @"$/hoge/";
            localWorkspace = versionControlService
                .CreateWorkspace(
                    workspaceName,
                    versionControlService.AuthorizedUser,
                    string.Empty,
                    new[] { new WorkingFolder(serverProjectPath, localProjectPath) });

            localWorkspace.Get();

            localWorkspace.Delete();
        }
    }
}

ちょっとだけ説明。

var teamCollectionUri = new Uri(@"https://XXXXXXXX.visualstudio.com/DefaultCollection");
var teamCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(teamCollectionUri);

自分のvisual Stuido OnlineのURI(つまりURLです。)とチームコレクションを指定します。URIだけ指定して、後かチームコレクションにアクセスする2段構えの方法もあります。今回は、チームコレクションを直接指定しました。

const string localProjectPath = @"c:/source/test";

ローカルのワークスペースのパスを指定します。c:/source/testというパスを指定しています。一時的に利用するなら、時刻などを指定したフォルダを作成してもいいかもしれません。サンプルコードなので適当ですが、実際に利用しているWorkSpaceのパスなどを指定すると、ギャーってなるので注意してください。

string workspaceName = string.Format("{0}_{1}", Environment.MachineName, DateTime.Now.ToString("yyyyMMddHHmmssms"));

ワークスペース名です。今回は、既存のワークスペースは利用せず一時的に別のワークスペースを作成し、そこにソースを落としたいので、既存のワークスペースに被らないような名前を指定しました。ワークスペースが被らないことも注意する必要がありますが、その前に指定したlocalProjectPath も既存のワークスペースですでに指定されていたりするとエラーとなるので注意が必要です。

            localWorkspace = versionControlService
                .CreateWorkspace(
                    workspaceName,
                    versionControlService.AuthorizedUser,
                    string.Empty,
                    new[] { new WorkingFolder(serverProjectPath, localProjectPath) });

ワークスペースを作成します。既存のワークスペースを取得する場合は、GetWorkspaceメソッドまたあTryGetWorkspaceメソッドを利用します。

const string serverProjectPath = @"$/hoge/";

Visaul Studio Onlineの取得したいソースのパスを指定します。

localWorkspace.Get();

実際に、ソースを取得します。

localWorkspace.Delete();

一時的に利用したかっただけなのでワークスペースを削除します。削除し忘れるとVisual Studio 2013等から削除しなければなりません。

今回は、ユーザ名、ドメイン、パスワードを指定していませんが、これはVisual Studio 2013からVisual Stuido Onlineへ接続している為と思われます。未接続の場合は、認証する処理も必要です。

まとめ
1.Visual Studio Onlineは、ローカル上のTFSと同様にTFS APIが利用できる。
2.TFS APIは、以下のdllを参照することで利用できる。
 ・Microsoft.TeamFoundation.Client.dll
 ・Microsoft.TeamFoundation.VersionControl.Client.dll
3.TFS APIを利用することで、Visual Studio 2013からソース管理するよりも高度な操作が可能である。


 

【キーボード】6年前のRealForceを復活させることはできる!?その3

  • 2014.04.14 Monday
  • 22:12
JUGEMテーマ:コンピュータ

------------------------------------------
【キーボード】6年前のRealForceを復活させることはできる!?その3
http://pro.art55.jp/?eid=1304218

【キーボード】6年前のRealForceを復活させることはできる!?その1
http://pro.art55.jp/?eid=1304216

【キーボード】6年前のRealForceを復活させることはできる!?その2
http://pro.art55.jp/?eid=1304217
------------------------------------------


前回は、鉄板の錆対策とキートップの受け口の清掃・グリスアップを行いました。また、ゴムの部分に細かいごみは降り注いでいたことを確認し、サイバークリーン、通称スライムを使ってほこりの除去を行いましたが、外側しか清掃できていない状態です。そこで、今回は、電子基板とゴムの部分を清掃していきたいと思います。

用意したものは「無水エタノール(99.5%)」です。ゴムと基盤を分離して水洗いならぬアルコール洗いをしたいと思います。ちなみに無水エタノールは薬局やAmazonで購入できます。消毒用エタノールより純度が高く、飲んだり、消毒用に使ってはダメなので注意が必要です。

○冷蔵庫の外側・証明器具のカサ・鏡等に
○換気扇・レンジ・オーブン・レンジまわりの壁等に
○便器・便座等に
○密封容器についた食品の臭いとりに

とラベルに書かれます。

それではRealForceさんを分解していきます。裏面の爪を外して、ケースから脱皮させます。
電子基板のねじを外して、電子基板と鉄板を分離します。
電子基板に張り付ているゴムを外して、アルコールでふきます。
※アルコールでゴムをふくと、ゴムが痛むことがあるそうです。うん、やっちまったい!
電子基板をアルコールでじゃぶじゃぶ洗います。



乾かします。


テンキーの部分のゴムが大分へたっていました。


-キーと*キーの間が浮き上がっています。さらにねじ穴をふさいでしまってます。+キーと9キーのゴムが重なってしまってます。


というわけでハサミでチョキチョキして、ゆがみを修正しました。

そうそう、ゴムは全部くっついているわけではなくキーによって独立したりしています。よってばらばらになった場合、パズルを解くことになるので、写真を撮っておくと幸せになります。





鉄板と結合させ、ねじ受けがあるタイプのネジの端四点を仮止めして、PCにつなげてテストしてみました。結果+キーの重くなってました。失敗です。重くなる理由として、ゴムの中心がずれている。ゴムの空気の抜け口がふさがれている。の、どちらかだと思います。バネがずれていた場合は、重みが変わるのではなく、キーの反応する位置が深くなったり、反応しなくなったりと、反応が変わります。

そうそう、キーの押上圧力はどうやら、ゴムの空気穴の容量が大きな要因を占めているようです。仮止めをして、キーをたたいた場合、基盤とゴムに隙間が生じているため、空気が簡単に抜けてしまいます。そのため、タイプピングがすごく軽くなりました。ねじをしっかり締めれば逆に重くなると思います。これは想像ですが、30gとか40gという押上圧は、この空気の通り道の容量の違いなのかな?って想像ですが予想しています。実際見比べないとわかりませんが、残念ながらこの筐体はAll45gなので見比べる対象がありませんでした。

蛇足は置いておいて、ねじをいったんはずし、ゴムとバネを微調整。バネが結構ずれているものがあったので、危ないところでした。うん。おおざっぱすぎました。

ねじを止めて再度テスト。OKでした。

ということで、ねじをすべてしめて、蓋を閉めて終了です。

今回、完全に電子基板とゴムを分離してしまったため、今まで張り付いていた部分から空気が抜けるのか、少しだけキーが軽くなりました。好みの問題だとは思いますが、強いのがお好みなら強めにネジをしめ、逆が良いなら緩めで多少微調節ができそうです。ただし、緩すぎると故障の原因になると思うので注意ですね。

まとめ、

・ゴムには空気穴がある。(空気穴からごみが入り込む可能性もある)
・ゴムの押上圧は、空気穴の容量が関与しているぽい。
・電子基板は無水アルコールで洗うとごみを落とせる(自己責任で!)
・ネジは二種類ある。基盤と鉄板をくっつける役割と基盤とゴムの密着度を調節できるネジ(勘違いかも)

こんなところです。しかし、大分、キーボードがきれいになりました。最初のキートップしたのゴミさんこんにちわ状態から考えると大分きれいになりました。キートップの戻りも早くなりましたし、反発力も自分好みに調整できました。うん。狙った以上の成果が得られたのでかなり満足です!

【キーボード】6年前のRealForceを復活させることはできる!?その2

  • 2014.04.13 Sunday
  • 19:54
JUGEMテーマ:コンピュータ

------------------------------------------
【キーボード】6年前のRealForceを復活させることはできる!?その3
http://pro.art55.jp/?eid=1304218
【キーボード】6年前のRealForceを復活させることはできる!?その1
http://pro.art55.jp/?eid=1304216
【キーボード】6年前のRealForceを復活させることはできる!?その2
http://pro.art55.jp/?eid=1304217
------------------------------------------

前回は、キーボードの簡単なお掃除して、錆があることを発見してしまいました。ということで、今回は中を分解してさびを落としてみたいと思います。とりあえずホームセンターでさび落としを購入し、キーボードを分解した状態で、鉄板の部分だけを水洗いし、さらにさび落とし液を塗ってみました。

Before)


After)


えっと、見事にさび以外の塗装まではげちゃいました。想定外です。ちなみに、見る限り、RealForceの鉄板には2種類の塗装がされているようで、その一つが取れてしまったようです。キーの隙間から見える部分だけ、黒い塗装が残っているのがわかります。見える部分の考慮か光が当たるとか、理由はわかりませんが、2種類です。ええ。片方は取れやすいと・・・。

ということで、金属の地肌が見えてしまっているので、さらに錆びてしまう恐れがあるので、対処することにしました。



鉄板についているキートップの受け口が外れるみたいなので外していきます。外し方は金属との接地部分に爪がついているので、その爪をマイナスドライバーで少し押した状態で、キーを受けたら押すと抜けます。力はそれほどいりませんが108個あるので結構疲れます。


プラスティックの受け口をすべて外してから、金属を洗って、やすり掛けをしました。プラスティックで隠れていた部分やしつこく残っていた部分の錆をこすり落としました。やすりは番目の大きい方から小さい方へ変えていくことできれいに仕上がります。仕上げ用の消しゴムのようなやすりを使ったところ結構ピカピカになったので、これでいいのではと思いましたが、やはり一度錆びてしまっているのでコーティングした方が良いかなと思い、コーティングを施すことにしました。

すこし失敗したと思うのが、実は先に塗料を買ってしまっていて、キートップの受け口は外れないものだと思っていたので、筆で塗ることを想定していたのですが、鉄板のみになってしまったので、スプレーでよかったと、うん、後の祭りです。

とりあえず塗料にチャレンジ。プラモデルはミニ四駆はやったことはありますが、色を塗ったことはありません。こういうの初めてです。




タミヤのタミヤカラーエナメル塗料(X-7)を模型屋さんで購入。塗りました。最初に軽く塗って、一度乾かしてから2度塗りすることできれいに仕上がります。残念ながら私のスキルではきれいにはなりませんでしたが・・・ほとんど、見えない部分なので問題ありません。先にさび止めの塗料を塗るかどうかで迷いましたが、めんどくさいのやめました(笑)



エナメルを乾かしている間に、キートップの受け口を中性洗剤で洗浄し、乾かし、その後、可動部分にグリスを塗りました。とりあえず筒の部分を塗りたくってから、筒を落とすと余分なグリスが出てくるので拭き取れば大丈夫ではないかと思います。裏面も可動部があるので塗ろうかどうか迷ったのですが、途中までは塗って途中からやめました。うん面倒だったので(笑)

さらにゴムの掃除をしまいた。



本来ならこの部位分はごみが入らないと思うのですが、さすがは年数がたっているため、おそらくはキートップ受け口の筒の間を抜けた細かいほこりが積もっていったと思われます。サイバークリーンを使って丁寧にほこりを除去しました。キーが若干重く、戻りが遅いと感じたのは、ゴムがへたったのではなく、筒の中にごみが入り込み、摩擦力が強くなったのではないかと思われます。今回は洗浄のちグリスアップしたので、組み立てた後にどうなるか楽しみです。





鉄板が乾いたので、キートップの受け口を取り付けて、基盤を装着しました。と、簡単に書きましたが、結構大変でした。まずねじ穴をつぶしてしまってることに気づきました。幸いエナメルなのでねじ込めばねじ穴は復活しました。うん。強引。そして、鉄板と基盤の装着が大変でした。いくつかのゴムがはがれてしまっていた為、基盤から鉄板の方にゴムを置いて張り合わせました。こうすることで正確な位置にゴムを配置できます。ただし、ゴムが切れ切れになっているので、パズルを解く必要が出てきます。基盤にゴムが張り付ている場合は、そっとしておくのが無難かとおもいます。



受け口にゴムを配置している写真です。向きがあるので注意が必要です。基盤を張り合わせる際に何度かPCにつないでテストをしました。どうやらテンキーを結構酷使していたらしく、ごみがゆがんでたので、最初に端合わせた際にいくつかのキーが重かったり反応しなかったりしてしまいまいた。ねじを全部締めた後に気づいたので結構ショックでした。四方を四点止めした後に軽くテストをした方が良いと後で思いましたね。うん。



ちょっと気になったのが、「無変換」「スペース」「変換」の間に使われていないキーが二つあることを発見しました。気になったのでプログラムを組んで、動作させてみたところ、

「無変換」「スペース」の間にあるのがSystemキーでした。
「スペース」「変換」の間にあるのがRightCtrlキーでした。

うん。マジでミスりました・・・。自分が知らないSystemキーなるものがあると思って、素通りしてしまいました・・・いやSystemキーってShiftとかAltとかCtrlですね。どれなのか詳細を調べずスルーしちゃいました。今度、分解したときにでも覚えていたら見てみます。

そうそう。このキーボードのスイッチは電荷の変化を見てON/OFFの判定をしているとのことですが、具体的には、基盤の丸いしるしがあるところに、円錐型のスプリングを置いて、そのスプリングをへこますと、スイッチがONになるようです。ゴムは押すという物理的なツールというだけで、全くスイッチのON/OFFの電気的な仕組みには関与していないようです。逆にバネは、リニアに反発力が向上する円筒形のバネと違い、円筒形の構造をしているため、ログ関数的な反発力が向上することが予測され、さらにゴムよりはるかに力が弱いことも確認(指感覚ですが・・・)できたので、バネ自体は、このキーボードの打鍵感には関与していないようです。打鍵感の改善をしたければ、ゴムとキートップの受け口の筒の部分を改善するのが良いかと思います。ゴムの部分の空気の抜け道が作られていますが、この辺も細工すると打鍵感に変化がみられるのではないかと思います。絶対やりませんけど(笑)

で、大分、どうでもいいことに時間をつぶしながらも、ようやく組立、組み立てる際に、筐体の隙間にスポンジを詰め込みました。どうもこの筐体は、キーをたたいた際にボワンボワンと音が響くの気になったので詰めた次第です。





で、キートップをもとに戻すと



うん。色が違いますね。

で、まあ完成と







キートップの隙間から、光沢のある赤がチラリと見えます。うん、狙い通りです。

以下、使ってみた感想。

キーの重さは変わりませんでした。ただし、キーの戻りは明らかに早くなりました。
ボワンボワンという音は軽減しましたが、キートップのキンキンという音がクリアーになりました。
雑味がなくなったと表現すれば聞こえはいい感じですが、高音がうるさくなりました(笑)
見た目は筐体のプラスティックにテカリや傷があるので、どうにかしたいと思います。
イタ化するのも良しかなと思います・・・うんやるわけねーだろ!(イタキーボードでググってみてください)

【キーボード】6年前のRealForceを復活させることはできる!?その1

  • 2014.04.13 Sunday
  • 17:45
JUGEMテーマ:コンピュータ

------------------------------------------
【キーボード】6年前のRealForceを復活させることはできる!?その3
http://pro.art55.jp/?eid=1304218
【キーボード】6年前のRealForceを復活させることはできる!?その1
http://pro.art55.jp/?eid=1304216
【キーボード】6年前のRealForceを復活させることはできる!?その2
http://pro.art55.jp/?eid=1304217
------------------------------------------

少し前に中古のRealForceを手に入れました。

東プレ Realforce108[SJ08J0] MyShopオリジナルモデル
希望小売価格 オープンプライス
MyShop価格 20,366(税込) [税抜 18,857円]
https://www.justmyshop.com/app/servlet/item?item_code=9005581

5,6年くらい前にジャストシステムから限定販売されていたRealForceらしいのですが、それをオークションにて4000円台で落札しました。手元に届いてすぐに状態をチェック。






とりあえず、思っていたよりも状態ははるかに良い感じでした。キーの印字が「A」や方向キーなどが結構薄くなっている状態だったのですが、それはキートップを交換すればよいだろういう事で、使えそうだと判断できました。それでキーを外してみました。キートップを外すには専用の工具が必要で、東プレさんからも販売されていますが、個人的にはダイヤテックさんから出ている「FILCO KeyPuller」という工具がお勧めです。ミスってもよく面をガリってやらない構造になってます。



キーを外してびっくりしました。うん、とりあえずほこりだらけでした。どうやら出品者さんは、RealForceがドライバーなしに簡単に蓋を外せるという事をご存じなかったのではないかと思われます。結構大きなゴミも「こんにちわ」している状態だったのでとりあえず清掃。清掃前はお見せできないレベルだったので写真は途中経過の写真です。



大体、掃除をおえたのですが、残念なお知らせです。鉄板がさびてました。うん。これはまずいです。想定外でした。一応、キーボードの機能としては、現状はきちんと動作しているのですが、さびが浸食していけば、使えなくなる日も近いでしょう。さびを落とす必要があります。

まあ、さび落としは後にして、とりあえずキートップを交換してみて、印字の問題を解決してみました。





キートップを変えただけですが、大分、きれいになりました。残念がらテンキーの部分がないため、テンキーはテカってます。てか、これだけ高いキーボードなので、手からない材質にしてほしいですね。あとキートップも消えない材質で・・・。

で、とりあえず数日使ってみたのですが、気づいてしまいました。どうもキーの戻りがRealForce 91 UBK-Sにより遅いということに。気づいてしまったのです。キーを押す時も若干押し始めが重く感じます。中のゴムがへたっているのかと予想してみましたが、分解してみないとわからないので、錆の処理の時にでも確認してみることにしてみます。

まとめ。
・6年間のキーボードのなのに十分現役で使える。
・キートップだけではなくキーの下の掃除は重要。
・キーの下に鉄板が入っているが、これをメンテンスしてないと錆びる。

今後の方針。
・錆の処理をする。
・キーの動作が重い原因を探る。
 

【キーボード】RealForce が壊れて帰ってきた。

  • 2014.04.10 Thursday
  • 21:49

 以前、RealForce 91 UBK-Sを2台買ったぜ!って自慢したのですが、ええ、しましたとも。もう大惨事ですわ。RealForceを買った当時、うれしくて、インターネット上にあふれるRealForce情報を集めては一喜一憂してたんですね。それで、なんかガタつきがあるっていうイチャモンがちらほら散見していたので、まさか自分のはそんなことはあるまいと、思ってみてみると、うん。どうも右上がガタガタとするんですよね。マジで・・・。さらに左下のゴムの接地面がどうもきれいに接地していないのかつるつる滑る。机がわるのかなーって思って、場所を変えると更に勢いよく滑るんですわ。3カ所試したところで、気が付いたんです。場所を変えずにキーボード180度回転されて、滑る箇所が同じだったら、キーボードが悪い、逆だったら机が悪いってね。うん、結果、キーボードが悪いようだったので、東プレさんにちょいとどうにかならないかとお問い合わせフォームで問い合わせたら、こちらで調整しますので送ってくださいと返信が来たんです。丁寧な返信ではありませんでしたが(笑)まあ、この時点ではRealForce信者でしたので、多少の不都合は目をつむります。でも、直してくれるんならと送ったんです。そして、2週間以上たちました。一度、質問メールが来たのでそれに返信もしました。そして、今日、先ほど手元に届いたんです。結構、心待ちにしていたので、送られてきた箱を喜んで開封したんです。そのあとのことは正直よく覚えていないのですが、こんな感じでした。

開封する。
机に設置する。
キーボードが滑らないか押してみる。
滑らない。
キーボードがガタつかないか右上を押してみる。
ガタガタ
あれ?
あー爪が中途半端になってるんだな。
爪を見てみるとたたまれている。
うん?
もしかして、爪を出した状態でがたつかないようにしたのかな?
なんて思ってみる。
爪を出してみて
がたつきチェック。

ガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタガタ





おおおおおお!
がたつくぞ!
てか前の10倍くらいガタつくぞ!

その後、ガタガタ震えながら営業さんの携帯に電話しました。

電話した結果新品を送りますって事になりました。


どーなっとんじゃ!!!


ちなみにどれくらい隙間が空いてたかというと、
一円玉が差し込めるくらい隙間空いてましたわ。
報告によると、キーボード内部の鉄板の爪の部分が反り返っていた為
ガタつきがあったという事でしたが、
もしかして、マジで力任せにねじったのかな?
金属って一度ゆがむともとには戻らないよ?素人なん?
力任せにねじると、数日間は金属が動くよ。うん。素人なん?まじで!?


東プレの中に人にキーボードクラッシャーがいるとは思わなかったよ。








----------------------------------------
(追記)
そういえば、RealForceを注文したあと、待ち焦がれすぎて、いろいろしてべていた時期に一つ発見したことを思い出しました。たしかゆがんでいるって内容が2チャンネルのまとめブログ(だとおもう)に掲載されていて、内容をおっていくと筐体をねじると治るみたいな指摘を受け、実際に不具合を訴えてた人が試したら治ったみたいな投稿があったことを思い出しました。もしかして、ねじると治るのかな?って思うんですけど、交換してくれると約束してくれたので、まあ、やめておきます。はい。てか、中の人、まさかねじっただけ?ねじると時間がたつと、またずれるよね・・・なんども微調整が必要だよね・・・めんどくさー。

----------------------------------------
(追記)
東プレさんから連絡がありました。現在、在庫がなく、次回の製造が完成次第交換していただけるとのことでした。それからガタつくキーボードをその間つかわなければならないので対応策も教えてもらいました。

「ちょっと乱暴ですが、KBを手に持った状態で
 左側を下方向、右側を上方向にねじってください」

※これやって壊れても、私は責任を負いかねますので、
 同じ症状で悩んでる方は素直に東プレさんに相談されることをお勧めします。




【WPF】FrameworkElement.DataContextプロパティの値が変わるタイミング。

  • 2014.03.30 Sunday
  • 14:23
JUGEMテーマ:コンピュータ

【WPF】FrameworkElement.DataContextプロパティを無効にする方法
http://pro.art55.jp/?eid=1304213


前回は、DataContextに設定した値をクリアーし、親要素の値を再設定したい場合は、DependencyProperty.UnsetValueを設定するばよいという方法を紹介しましたが、今回はDataContextの値が変更されるタイミングを見ていきたいと思います。私の個人の意見としては、一度設定したDataContextの値を変えてしまうような実装は、WPFアプリケーションの設計としては、バグの元になりやすく、間違っていると思います。(伝搬して変更した子要素のDataContextも値の書き換えという事にはなりますが、それは対象外と・・・)

今回は、DataContextの値が変わるタイミングです。正直、私はこの点に関して意識したことは全くありませんでした。前述の通り書き換えないからです。必要なタイミングまでには、値が設定されていたので気にしていなかったということなのですが、DependencyProperty.UnsetValueを設定したタイミングで、その設定した要素や親要素を見に行っているような動きをしていたため、少し違和感を感じたのがきっかけです。親要素が変わったタイミングで子要素に伝搬するだけだと思っていたからです。

試してみました。

    <Grid Background="Pink" x:Name="TopPanel" DataContextChanged="OnDataContextChanged">
        <Grid Margin="40" Background="HotPink" x:Name="MiddlePanel" DataContextChanged="OnDataContextChanged">
            <Grid Margin="40" x:Name="BottomPanel"  Background="DeepPink" DataContextChanged="OnDataContextChanged">
                <Button Margin="40" x:Name="Button" Click="OnClick"  DataContextChanged="OnDataContextChanged">Click</Button>
            </Grid>
        </Grid>
    </Grid>

        private void OnClick(object sender, RoutedEventArgs e)
        {
            Debug.Print("BottomPanel.DataContext に20を設定する");
            BottomPanel.DataContext = 20;

            Debug.Print("TopPanel.DataContextに10を設定する");
            TopPanel.DataContext = 10;

            Debug.Print("BottomPanel.DataContextにDependencyProperty.UnsetValueを設定する");
            BottomPanel.DataContext = DependencyProperty.UnsetValue;

            Debug.Print("Buttonのコンテンツを書き換える。");
            var button = (Button)sender;
            button.Content = button.DataContext;
        }

        private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            var element = sender as FrameworkElement;
            string message = string.Format("{0}.{1} = {2}", element.Name, e.Property.Name, e.NewValue);
            // MessageBox.Show(message);
            Debug.Print(message);
        }

これを実行すると、以下の出力が得られます。

BottomPanel.DataContext に20を設定する
BottomPanel.DataContext = 20
Button.DataContext = 20
TopPanel.DataContextに10を設定する
TopPanel.DataContext = 10
MiddlePanel.DataContext = 10
BottomPanel.DataContextにDependencyProperty.UnsetValueを設定する
BottomPanel.DataContext = 10
Button.DataContext = 10
Buttonのコンテンツを書き換える。


VirualTreeの位置関係はXAMLの通り

TopPanel - MiddlePanel - BottomPanel - Button

まず、BottomPanelの値を変えると、
BottomPanelとその子のButtonのDataContextの値が変わっていることがわかります。

TopPanel - MiddlePanel - BottomPanel(20) - Button(20)

TopPanelの値を変えると、TopPanel とMiddlePanel まで値が変わります。
すでにBottomPanelに値が設定されているため、BottomPanel以降は伝搬しません。

TopPanel(10) - MiddlePanel(10) - BottomPanel(20) - Button(20)

BottomPanelをDependencyProperty.UnsetValueを設定することで、無効にします。
そうすると、そのタイミングで、BottomPanelは親要素のDataContextが反映されます。
そして、子要素(Button)にも伝搬します。

TopPanel(10) - MiddlePanel(10) - BottomPanel(無効) - Button(20)
TopPanel(10) - MiddlePanel(10) - BottomPanel(10) - Button(10)

以上のことから、DataContextはDataContextに値を設定したタイミングで、常に自分自身から子要素までの値が切り替わっていることが確認できました。私が想定したもう一つの可能性は、DataContextの値が必要となったタイミングで値が切り替わっているのではないかというものがあったのですが、そうではないようです。「見込生産」か「受注生産」かどちらなんだろうってちょいと思ったんですが、「見込生産」に該当するようです。

まとめ、

1.FrameworkElement.DataContextプロパティは、値が変わったタイミングで、
  値が設定されていない直近の子要素まで伝搬する。
2.FrameworkElement.DataContextプロパティに、DependencyProperty.UnsetValueを設定すると
  設定された要素は、親要素から値を取得し設定される(値の場合は値、nullの場合はnull)。
  さらに1の通り、値が伝搬する。

 

【WPF】FrameworkElement.DataContextプロパティを無効にする方法

  • 2014.03.30 Sunday
  • 05:42
JUGEMテーマ:コンピュータ
 
値を代入したFrameworkElement.DataContextプロパティに対して、親要素に存在するFrameworkElement.DataContextプロパティの値を再取得したい場合は、nullを指定するのではなく、DependencyProperty.UnsetValueを指定する必要がある場合があります。

例えば、以下のコードが書かれていたとします。

    <Grid Background="Pink" x:Name="TopPanel">
        <Grid Margin="40" Background="HotPink" x:Name="MiddlePanel">
            <Grid Margin="40" Background="DeepPink">
                <Button Margin="40" Click="OnClick">Click</Button>
            </Grid>
        </Grid>
    </Grid>

        private void OnClick(object sender, RoutedEventArgs e)
        {
            MiddlePanel.DataContext = 20;
            TopPanel.DataContext = 10;
            MiddlePanel.DataContext = DependencyProperty.UnsetValue;

            var button = (Button) sender;
            button.Content = button.DataContext;
        }

上記のサンプルコードでは
buttonのContentプロパティに10が代入されます。

MiddlePanel.DataContext = DependencyProperty.UnsetValue;

の部分を

MiddlePanel.DataContext = null;

と書くと、Contentはnullが代入されます(nullが代入されるという言い回しはおかしい気がしますが)。

DataContextプロパティに限った話ではありませんが、nullを指定するのではなくDependencyProperty.UnsetValueを代入する必要があります。それが理由かどうかは正確なところはわかりませんが、DependencyProperty.UnsetValueを代入したいがために依存関係プロパティの型がobject型になってしまっているところがあります。ItemsSourceの型がobject型になっているのは多分そのせいかな・・・。

------------------
(参考)

クラス設計から見たDataContextプロパティ
DataContextプロパティは、FrameworkElementクラスで定義されているプロパティ
DataContextプロパティは、依存関係プロパティ。
DataContextプロパティは、FrameworkPropertyMetadataOptions.Inheritsオプションが指定されている。

参考資料
FrameworkElement.DataContext プロパティ
http://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.datacontext(v=vs.110).aspx


------------------
(追記)
「ItemsSourceの型」に関してちょいと意味不明なのでした。

【キーボード】Majestouch 2 Tenkeyless クリームホワイト・茶軸・かなあり

  • 2014.03.24 Monday
  • 05:00
JUGEMテーマ:コンピュータ


この前、東プレのRealForce UBK-Sを買ったじゃん!って言われそうですが、ダイヤテック FilcoのMajestouchも気になっていたので、気になっていたので、2回言いましたよ。買っちゃいました。にわかキーボードマニアです。にわかです。はい。で、買ったのは

「Majestouch 2 Tenkeyless クリームホワイト・茶軸・かなあり」というやつです。うん。見た目がきれい。春って感じです。

 

きれいでしょ?見つけたら買うでしょ?

で、使ってみて、うん。あれです。茶軸って、Cherry軸の中ではうるさくない方だと思ってたんですが、「中では」とは、比較するところ間違ってましたね。キーボードの中ではうるさいって言うかやかましい部類でした。お店とかで茶軸を散々試し打ちしてたんですが、お店ってそもそもやかましいじゃないですか・・・家の中とは環境が違いますよね。気づかなかったー。お店だとRealForceなんて静音じゃなくて無音になってたもんなー。と、まあ、一人暮らしなので、家でやかましくけたたましく打とうが、そこまで気にする必要はないのですが、会社は無理かなー。会社で二つ必要なんだけどなー。うーん、どうしよう。

まあ、いいんです。美しいから、



ほら、Caps Lockをかけるとグリーンに光る。美しいです。Caps LockもScroll Lockも全く使わないんですが・・・。うーん。

そうそう、これってクリームホワイト×グリーンなんですが、クリームホワイト×ピンクとかもいけるんじゃないかなーって思うんです。今のところリリース予定はなさそうですが、女性ウケが良いかとおもうんですよね。まーキーボードにこだわる女性がどのくらいいるのか知りませんが、新しい客層の開拓とかしないのかなー?

ためしにPhotoShopでピンクにしてみました。



ちょっとピンクがくすんでしまってしまいましたが、うん。やはりいけると思います!

---------------------------------------------
真面目な話

今回、紹介したキーボードは

Majestouch 2 Tenkeyless のWeb限定発売の特別カラー仕様です。おそらくですが、色以外は「Majestouch 2 Tenkeyless 」と全く同じものと思われます。Cherry軸で赤軸と茶軸のみあります。玄人好みの黒軸と青軸はないようです。キートップは、かなありの日本語配列です。10キーがありません。エンターキーとスペースキーは、納品時は白になっていますが、上記写真の通り、緑色のキーが用意されており、取り換えが可能です。ただし、エンターキーとスペースキーも針金のサスペンサーがついており、取り換えにはちょいとテクニックが必要です。まあ、とにかくお洒落です。普段、タイピングされている方で、音を気にされない方にプレゼントとかいかがでしょうか?うん、これは素直にお洒落だと思います。

【通販限定】Majestouch 2 Tenkeyless クリームホワイト・茶軸・かなあり

【通販限定】Majestouch 2 Tenkeyless クリームホワイト・赤軸・かなあり

--------------------------------------------
(追記 2014/03/29)
会社等の開けた場所で利用してみましたが、そこまで気になる音ではありませんでした。
逆に狭い部屋では、音が響くためうるさく感じたようです。


 

【キーボード】RealForce91UBK-Sを使ってます。

  • 2014.03.17 Monday
  • 03:03
JUGEMテーマ:コンピュータ
ここに本文を記入してください。

 ちょうど一ヶ月前あたりに、東プレのRealForce91UBK-Sというキーボードを購入しました。なぜキーボードを買おうと思ったのか、今となってはわかりません。たぶん、普段からノートパソコンのキーボードにイラついていたというのが、理由だと思います。キーの配置はおかしいし、ごみが入り込んで打ちづらいキーがあったりと、まあ不満がありまして、ちゃんとしたキーボードを買おうかなって思ったわけです。おー思い出したね。そうそう、で、ちゃんとしたキーボードって何だろうと、大昔、PFUのHHKB Professional2(英語)を買ったんですが、これが、キーのタッチはものすごくよかったんですが、うーん。英語配列キーボードを家で使いながら会社では日本語配列というの、どうしても頭の切り替えがうまくいかず、半年使った挙句、普通の配列のフルキーボードに戻ってしまいました。でも、キータッチはよかったんだよねー。そうそうクレバリー2号店で買ったんですが、その時、こっちもいいなーって思ったのが東プレのRealForceのキーボード。っていうかどっちもHHKBもRealForceも東プレ製なんですよね。うん、この前、HHKB分解したら「Topre」って基盤にもろ書いてましたわ。すげー脱線しましたけど、結局、まともなキーボードを探してたら、うん、東プレのRealForce以外なくね?って思いまして、思い切って買いました。ええ、ええと二つね。その写真が、右上にあるやつです。RealForce91UBK-Sです。キートップ買えちゃいました。テヘペロ。

 まあ、わかりますよね。二ついりますよね。仕事用とプライベート用。RealForce91UBK-Sを一つ目買ったんですよ。プライベート用で買ったんですが、プログラミングをしてる時間が多いのはお仕事のほうなので、会社にもっていって使ったです。いやー。いやだー。家でも家でもツカイタイナリヨー!って禁断症状がでたので、うん。持ち運ぼうかと本気で考えましたけど、重いし壊れても嫌だし。なので、ここはマネーの力で!解決じゃ!本来のRealForce UBK-Sは、キートップも本体も黒です。なんか味気ないのでキートップ別売りしてたので、カラフルにしてみました。すごくおいしそうな色をしていていい感じです。

 RealForce91UBK-Sについて少しだけ解説。まあ、本当に気になる方はメーカの解説を見たほうが良いでしょう。先に言っておきました。

◇キー配列◇
 RealForce91UBK-Sは見ての通り10キーのないキートップが91個あ日本語配列のキーボードです。フルキーボードでもよかったのですが、普段PC2台並べていることが多いので、机が狭く、マウス場所を確保するには10キーは捨てざるを得なかったというのが選定の理由です。10キーがない分、マウスまでの距離が短くなるので、これは10キーがないデメリットよりも大きいかと思います。

◇静音性◇
 RealForceシリーズの中では「静音」とうたわれている類のキーボードです。秋葉原のソフマップさんとTUKUMOさんとヨドバシカメラさんで試し打ちしてみたので、静音というのは間違いないと思います。もう一回断りますが、RealForceの中だけの話ですよ。そうそうEnterキーだけは、音が大きいです。ほかのキーはスコスコという擬音が似合いますが、Enterキーだけは、何と表現したらいいか、ガスンガスンというのか、パコンパコンというのか結構響きます。Enterキーによるフォーカス遷移のテストをしてたら、なんか注目を集めました。うるさくしてすみません。
 そうそう静音で思い出しだしましたが、静音でないRealForce91UBKというのがあるのですが、RealForce91UBK-Sとはうち比べると音以外にも微妙に差があるような気がしました。RealForce91UBK-Sのほうがたたき切った時の衝撃がソフトな感じがします。まあ、RealForceの場合、底までたたき切るというような打ち方はしなくなると思うので、気にしなくてもいいかもしれません。

◇キートップ◇
 RealForce91UBK-Sのキートップはレザー印刷ってやつらしいです。まったくなんのことかわからないのですが、レーザーを使ってなんかしてるっぽいことは想像がつきます。ググってみるとレザーははげるらしいです。ヤフオクでも中古を眺めてみると、はげてるのがちらほらありました。ここは別売りの昇華印刷で書かれたキートップに変更したので無問題です。ただ、カナも印刷されているので、ちょっとごちゃごちゃした感じになります。カナ入力なんて滅びてしまえばいいのに。うん。

◇キーの重さ◇
 RealForceシリーズには、キーの重さが3タイプあるようです。30kgと45kgと55kgらしいのですが、これが指の位置によって混在しているのが、変荷重というらいいのですが、RealForce91UBK-Sは、それに該当します。小指の部分が30kgもそれ以外は45kg、Escが55kgらしいのですが、正直Escは重いと感じますが、ほかはよくわかりません。音が多少違うなーって感じがします。そうそう「静電容量無接点方式」という機構が採用されているらしいです。まったくわかりません(笑)どういう技術が使われているなんてどうでもいいです。結果、気持ちよくコーディングできれば問題ありません。はい。

◇感想◇
 数時間でRealForceのとりこになりました。TwitterでRealForceの良さをツイートしましたし、FaceBookでも知り合いに紹介しておきました。うん。と・に・か・く、うち心地が最高なんですね。どのくらい最高かというと、10年以上おかしなタイピングを続けていた私が、ただしいタイピングに矯正しなおそうと思ってしまうくらい、とても良いうち心地なのです。最高に気持ちいいです。まだ伝えきれてないような気がするので続けると、そうそうこのブログ、半年以上放置状態でしたが、少し前から再開していますよね。なぜでしょう!?そうRealForceのおかげです。だって、タイピング気持ちいいもん。文章を書くのが楽しくなる。コーディングするのが最高に気持ちいい。やっぱりねものを作ってる時にツールによるストレスがあるの、そういうのって蓄積されていくんです。それがツールのせいだって気づかず、イライラだけがたまってしまいます。あー解決、解決しましたよー!RealForceすごく良いです。

 気になる方は、家電量販店などで試し打ちしてから、ご購入を検討されることを強くお勧めします。

 

【WPF】DataGrid.AreAnyTouchesCapturedWithinを使ってみた。

  • 2014.03.13 Thursday
  • 22:22
JUGEMテーマ:コンピュータ

Source and Project

MSDNに記載されているWPF/DataGridのプロパティを眺めています。よくわからないものはサンプルコードを書いてみて動きを調べたりしています。本日は、その調べた中でも「あれ?」って思ったプロパティの一つ「DataGrid.AreAnyTouchesCapturedWithin」を紹介いたします。

DataGrid.AreAnyTouchesCapturedWithinはUIElementから継承するプロパティです。名前から推測するにタッチ操作関連のプロパティだとすぐにわかりますが、私は最初、依存関係プロパティなのでBindingオブジェクトを通じて、タッチの有無をトリガーとする機能を実装するものだと思ったんですね。

<DataGrid AreAnyTouchesCapturedWithin={Binding ... Mode=OneWayToSource} ...>

こんな記述ができるものだと思ったのですが、これはコンパイルエラーです。setterがないからエラーとコンパイラが教えてくれました。うーん。依存関係プロパティなのにできないんですが・・・。

で、まあ、依存関係プロパティであることは変わりないのでDependencyPropertyDescriptorを利用して、値の変更通知(実際には変更されたことは、わかりますが変更値の通知は来ません)をごにょごにょするコードを書いてみました。

<Window x:Class="Art55.DataGridAreAnyTouchesCapturedWithin20140313_001.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{StaticResource MainWindowViewModelKey}">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30" />
            <RowDefinition Height="*" />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="30" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="30" />
        </Grid.ColumnDefinitions>
       
        <DataGrid Grid.Row="1" Grid.Column="1"
                  x:Name="dataGrid"
                  ItemsSource="{Binding .Source.DefaultView}"></DataGrid>
       
     </Grid>
</Window>

using System;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Windows.Controls;
using System.Windows.Media;
using Art55.DataGridAreAnyTouchesCapturedWithin20140313_001.Annotations;

namespace Art55.DataGridAreAnyTouchesCapturedWithin20140313_001
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            var dependency = DependencyPropertyDescriptor
                .FromProperty(AreAnyTouchesCapturedWithinProperty, typeof (DataGrid));
            dependency.AddValueChanged(dataGrid, OnAreAnyTouchesCapturedWithin);

        }

        private void OnAreAnyTouchesCapturedWithin(object sender, EventArgs eventArgs)
        {
            Background = dataGrid.AreAnyTouchesCapturedWithin
                ? Brushes.HotPink
                : Brushes.White;
        }

    }

    public class MainWindowViewModel : INotifyPropertyChanged
    {
        public MainWindowViewModel()
        {
            _source = new DataTable {CaseSensitive = true};
            _source.Columns.Add("Columns1");
            _source.Columns.Add("Columns2");
            _source.Columns.Add("Columns3");
            _source.Columns.Add("Columns4");
           
            Enumerable.Range(0, 10)
                .Select(n => new object[] {"A" + n, "B" + n, "C" + n, "D" + n})
                .ToList()
                .ForEach(item => _source.Rows.Add(item));

            _source.AcceptChanges();
        }

        private readonly DataTable _source;

        public DataTable Source
        {
            get { return _source; }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

赤で書いたコードの解説ですが、DataGridコントロール、またはその中のVisual Tree上に存在するコントロールがタッチされたら、メインウィンドウのBackgroundをピンクにするコードを記述しました。それ以外は白です。

実行するとタッチの最中はピンク色で離すと白に戻ります。

まあ、普通はタッチイベントが別途用意されており、タッチしたタイミング、タッチでジェスチャーをしている最中、タッチが外れたタイミングでそれぞれイベントが用意されているので、わざわざDependencyPropertyDescriptorを利用することはないと思いますが、プロパティ自体の動きが気になったので試してみました。おそらくは、本来は、コントロール側で利用するためのプロパティか、タッチ中のイベントハンドリングの最中にタッチ状況を判定するような使い方を想定したプロパティではないかと思います。私が作成したコントロールではないので、あくまで想像ですと付け足しておきます。想像です。

そうそう注意点として、AreAnyTouchesCapturedWithinとは別にAreAnyTouchesCapturedというプロパティが存在します。名前から推測される通り、前者はVisual Tree上の子要素も含める判定するのに対して、後者は子要素は含めません。DataGridのような複数のコントロールが無数にある状況では、AreAnyTouchesCapturedがtrueになるような状況は皆無ではないかと思います。名前が似ているので注意する必要があります。

まとめ

1.AreAnyTouchesCapturedWithinはBindingできない。XAML上で記述できない。
2.AreAnyTouchesCapturedWithinは、そのタイミングでのタッチのキャプチャ(指定したコントロール内に一つでもあればtrue)を判定する。
3.AreAnyTouchesCapturedWithinとAreAnyTouchesCapturedは似ているので注意。
4.今回のサンプルコードは役に立たない。タッチイベントを拾ったほうが良い。

以上です。

Source and Project

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      
<< March 2024 >>

あわせて読みたい

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

selected entries

categories

archives

recent comment

  • 【WPF】DataGridに編集可能なComboBoxを表示するには?
    art55 (07/16)
  • 【WPF】DataGridに編集可能なComboBoxを表示するには?
    arisa (07/16)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM