8

編集:混乱を避けるために: これは、以前はMicrosoft Surface 1.0と呼ばれていた、または現在も呼ばれているテーブルに関するものです。Microsoft Surface 2.0と呼ばれていたテーブルのことでも、現在Microsoft Surfaceと呼ばれているタブレット コンピューターのことでもありません。編集終了

デスクトップ システムと MS Surface/PixelSense 1.0 の両方で実行する WPF アプリケーションを作成しています。これが通常どのように行われるかについての規則を探しています。

プラットフォーム間にいくつかの違いがあることは承知しています。そのため、基本的な GUI スケルトンがデスクトップと PixelSense バージョンで異なります (この場合、Canvasデスクトップ バージョンの a とScatterViewルート GUI 要素としての PixelSense バージョンの a)。

ただし、デスクトップ バージョンには、PixelSense バージョンでもほぼ同じように表示される WPF ベースのユーザー コントロール/GUI フラグメントが多数あります。

残念ながら、標準の WPF コントロールは PixelSense では機能しないようです。PixelSense のこの小さなコード サンプルで簡単に確認できるように、ユーザー入力に反応するために、次のようなコントロールCheckBoxを置き換える必要があります。SurfaceCheckBox

var item = new ScatterViewItem();
var sp = new StackPanel();
item.Content = sp;
item.Padding = new Thickness(20);
sp.Children.Add(new CheckBox() { Content = "CheckBox" });
sp.Children.Add(new SurfaceCheckBox() { Content = "SurfaceCheckBox" });
myScatterView.Items.Add(item);

どうやら、これは WPF ユーザー コントロールを変更せずに PixelSense に表示できないことを意味します。これは、PixelSense プレゼンテーション レイヤーに関する Microsoft のドキュメントなどのリソースのステートメントで確認されているように、WPF ツリー ビューに関連するこのようなSO の質問も参照しています。へ、PixelSense WPF レイヤーに関するこのブログ投稿、またはPixelSense 用に WPF デスクトップ アプリケーションを書き直す方法に関するこの SO の質問。後者のページでは、必要な変更を最小限と呼んでいますが、それでも変更です。

さらに、 PixelSense で特定の WPF デスクトップ コントロールを使用する方法に関するこの SO の質問に対する反応は、 .NET 4.0 を使用すると物事が簡素化される可能性があることを示唆していますが、PixelSense 1.0 SDK で.NET 4.0 がサポートされているとは思いません(これは .NET 3.5 です)。 -私が知る限り、ベース)。

ソフトウェア エンジニアとして、同じプログラミング言語を 2 回使用して、同じ GUI フラグメント (データ モデルに対して同じ動作をする同じレイアウトの同じコントロールで構成される) を記述する戦略にはまだ同意できません。これは間違っているようです。

したがって、これまでに見つけた3つの解決策は次のとおりです。

  • 標準 WPF の GUI フラグメントを記述します。次に、スクリプトを使用してこれらの GUI フラグメントを含むライブラリをコピーし、関連するすべての Xaml ファイルを (XSLT などを使用して) 標準の WPF コントロールをSurface*対応するものに置き換える方法で変換します。
    欠点:
    • WPF プロジェクトで何かが変更されるたびに、常にスクリプトを機能させて実行するために必要なメンテナンスの増加。
    • また、考慮すべき Xaml ファイルと、どのコントロールを何に置き換えるか (追加のサードパーティの PixelSense コントロールを考えてください...) を定義することは、複雑になる可能性があります。
    • 最後に、生成された PixelSense-Project は、Xaml ファイルを除いて WPF プロジェクトの正確なコピーになるため、PixelSense 固有のコードを導入することはできません (または、可能であれば、PixelSense プロジェクトを生成するためのスクリプトがさらに多くなります)。繁雑)。
  • PixelSense/Surface のみを対象とし、デスクトップ ユーザーに Surface SDK をインストールしてもらいます。提案してくれたユーザーClemensに感謝します!
    欠点:
    • ユーザーはSurface 1.0 SDKをインストールする必要があります。これは、現在のシステムでは重要な操作です。Surface 1.0 SDKを Windows 7 64 ビット マシンで実行するには、MSI ファイルのパッチ適用などのさまざまなアクションを実行する必要があります。
    • PixelSense/Surface 1.0 シミュレーターは、デスクトップ コンピューターで Surface 1.0 アプリケーションを実行できる唯一の方法です。このシミュレーターはあまり使い物にならず、一部のシステムではまったくバグがあります: 私のコンピューターでは、次のように表示されます: バギー Surface 1.0 シミュレーター(出力はシミュレーター ウィンドウの 3/4 しかカバーしていませんが、入力はウィンドウ全体に登録されています。サーフェス シミュレーションの右下隅をクリックするには、シミュレータ ウィンドウの (明らかに透明な) 右下隅をクリックする必要があります。)
  • GUI を作成するときは、標準の WPF または PixelSense コントロール クラスを明示的に使用するのではなく、適切なコントロール タイプを作成するプラットフォーム固有のファクトリを使用します。
    欠点:
    • GUI フラグメントを Xaml で記述することはできなくなりました。少なくともほとんどのコントロールとそのすべてのバインディングは、C# コードで作成する必要があります。

私は現在、3 番目のオプションに傾倒しています。これは、プラットフォームに依存しないために支払うのに許容できる代償のように思えるからです。それでも、WPF がデスクトップと PixelSense GUI の間の接続要素であるため、これは頻繁に発生する問題であり、これまでに解決されていないのではないかと思います。だから、私はここで尋ねています:これは通常どのように行われますか?

PS: 向きは問題ではありません。前述の GUI フラグメントは、PixelSense では回転可能な ScatterViewItem に表示され、デスクトップでは通常の垂直方向に表示されます。

4

1 に答える 1

7

ウェイバックマシンに飛び乗って、Surface1.0が構築されていた時期から始めましょう...

今年は2006年です。Windowsオペレーティングシステム(または主流の携帯電話でも!)にはマルチタッチの概念はありません。複数のコントロールを同時に操作しているユーザーにアプリケーションが応答できるようにするAPIはありません。既存のUIフレームワークに組み込まれている入力ルーティング、キャプチャ、およびフォーカスのメカニズムはすべて、基本的にマルチタッチが無駄のない方法で機能することを禁止しています。これらの問題が魔法のように消えたとしても、ユーザーが処理するように構築されていないことを行うと([保存]ボタンと[終了]ボタンを同時にクリックするなど)、ほとんどのアプリはクラッシュし、ユーザーは見た目と既存のアプリ/コントロールの感触は、大きなずさんな指ではなく、小さなマウスカーソル用に最適化されています。

そのため、2006年に、Surfaceチームを率いて、WPFの上に抽象化レイヤーを作成し、これらすべての問題を解決しました。その結果、あなたが求めている1.0SDKが完成しました。新しい階層を作成するのではなく、既存のUIコントロールをサブクラス化することで、ソフトウェアエンジニアリングの懸念を最小限に抑えようとしました(この決定により、SDKの開発がはるかに困難になります)。そのため、プラットフォームごとに異なるクラスをインスタンス化する必要がありますが、その後はコントロールの元のバージョンで使用されていたイベントとプロパティは、Surfaceバージョンで期待どおりに機能します。

2009年に早送り...マルチタッチが勢いを増し始めています。Windows 7はマルチタッチのネイティブサポートを追加しますが、UIフレームワークの問題には実際には対処していません。

2010年に早送り...WPFチームとSurfaceチームは協力して、Surfaceがリストした問題に対して構築したソリューションの多くを採用し、Win7のネイティブタッチスタックで動作するように適合させ、WPF4.0の組み込み部分として出荷します。 ..これにより、マルチタッチ入力ルーティング、イベント、キャプチャ、フォーカスが提供されましたが、既存のアプリを壊さずに、組み込みのWPFコントロールにタッチ機能を簡単に追加することはできませんでした。そこで、Surfaceチームは、ほとんどのSurface1.0UIコントロールのWPF4.0互換バージョンを提供する「SurfaceToolkitforWindowsTouch」をリリースしました。しかし、2006年のSurface 1.0は、この新しいバージョンのWPFと互換性がなかったため、最終的にWindowsとSurfaceの両方でキラータッチエクスペリエンスを構築できましたが、コードを100%共有することはできませんでした。

2011年に早送り...Surface2.0(PixelSenseテクノロジーを使用したもの)がリリースされました。新しいWPF4.0機能を使用し(Surface 1 SDKに付属していたAPIの多くは不要になりました)、基本的にWindows用のSurface Toolkitの更新バージョンが含まれていますが、コントロールのスタイルが変更されています。メトロ。最後に、製品のタイムラインが同期され、単一のコードベースを使用して、両方のプラットフォームで優れたタッチエクスペリエンスを構築できます。

さて、今日の質問に戻りましょう...あなたはSurface 1.0について質問しているので、2011年の素晴らしさは本当に役に立ちません。ただし、2010年のものを活用できます。

  1. WPF4APIとSurfaceToolkitforWindowsTouchを使用してアプリを構築します
  2. Surface入力イベントを取得し、それをWPF 4の入力スタックにルーティングするコードを記述します(これを実行する機能はあまり知られていませんが、このタイプのシナリオ用に特別に作成されています)。

では、どのようにそれらのことをしますか?良い質問。幸いなことに、私の仲間のJoshua Blakeには、ブログ投稿と再利用可能なコードがあります。http://nui.joshland.org/2010/07/sharing-binaries-between-surface-and.htmlをご覧ください。

于 2012-06-29T13:29:47.317 に答える