1

私は自分のアプリである程度の進歩を遂げていましたが、困った問題に遭遇しました。誰かが専門知識を提供してくれることを望んでいましたか?

私のアプリは「スコアシート」を意図しています... PivotItems の 1 つは、内部に水平方向の StackPanel を備えた ScrollViewer (水平スクロール、垂直無効) を備えています。この StackPanel には "ScoreSheet" UserControl が含まれています。これは基本的に、さまざまなテキスト ボックスを含むグリッドです。だから...次のようなものです(ScoreSheetアイテムがプログラムでStackPanelに追加されることを除いて):

<controls:PivotItem>
   <controls:PivotItem.Header>
      <TextBlock Text="score sheet" FontSize="45" Height="80" />
   </controls:PivotItem.Header>

   <ScrollViewer Width="470" Height="560" VerticalAlignment="Top" x:Name="sv_scoresheets" MaxHeight="560" MinHeight="560" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" IsHitTestVisible="False">
      <StackPanel Name="sp_scoresheets" Orientation="Horizontal">
         <local:ScoreSheet></local:ScoreSheet>
         <local:ScoreSheet></local:ScoreSheet>
         <local:ScoreSheet></local:ScoreSheet>
      </StackPanel>
   </ScrollViewer>

</controls:PivotItem>

「前へ」ボタンと「次へ」ボタンがページ下部の ApplicationBar にあり、ScrollViewer の左または右のアニメーションをトリガーするという概念がありました (つまり、現在のラウンド * スコアシートの幅)。ScrollViewer で "IsHitTestVisible" を "False" に設定すると、ユーザーは表示された ScoreSheet を手動で奇妙な位置に移動できなくなり、Pivo​​tItem 間で左右にスワイプしても期待どおりに機能します。

それはすべてうまくいきました。:)

ただし...問題はScoreSheetコントロールにあります。ユーザーがグリッドにスコアを入力できるように、いくつかのボタンとテキストボックスが必要です。ScrollViewer に「IsHitTestVisible」を設定することで、タップなどが行われます。無視されるだけ。

「IsHitTestVisible」を「True」に設定し、代わりに ScrollViewer の ManipulationStarted イベント (「e.Complete()」を呼び出す) で関数を実行しようとしましたが、ScoreSheet 内のコントロールにアクセスできますが、左にスワイプできません。 /もはやピボットアイテムの間。

それで… 誰か助けてくれませんか?ScrollViewer を移動させる代わりに、アクションを Pivot コントロールに「渡す」ことができるのではないかと考えていました。または、ScrollViewer を「非アクティブ」にして、内部のコントロールをインタラクティブにできる他の方法はありますか?

助けていただければ幸いです。御時間ありがとうございます!

4

2 に答える 2

0

ポールの意見とアドバイスに感謝します。Pivot は柔軟性を高めましたが、IsHitTestVisible="False" の場合、ScrollViewer コントロールと同様の問題がありました (含まれる要素のボタンやその他のコントロールが使用できなくなります)。また、このアプリの審美的な観点から、前へ/次へのボタンが押され、アニメーション化されて新しいシートが表示されたときに、複数のスコアシートが隣り合っているのが好ましいことがわかりました (ピボットアイテムとして、次のシートの前にビューからスクロールアウトします)。所定の位置にスクロールします)。

もう少し考えて実験した後、次のような目的の効果を達成しました。

<Canvas Width="470" Height="560" VerticalAlignment="Top" MaxHeight="560" MinHeight="560" MinWidth="470" MaxWidth="470">
   <Canvas.Clip>
      <RectangleGeometry Rect="0,0,470,560" />
   </Canvas.Clip>
   <StackPanel Name="sp_scoresheets" Orientation="Horizontal" CacheMode="BitmapCache">
      <local:ScoreSheet /></local:ScoreSheet>
      <local:ScoreSheet /></local:ScoreSheet>
      <local:ScoreSheet /></local:ScoreSheet>
   </StackPanel>
</Canvas>

「Canvas.Clip」を使用すると、現在表示されているスコアシートの両側にあるスコアシートを非表示にすることができ、前へ/次へのボタンが押されたときに StackPanel の Canvas.Left 位置をアニメーション化できました。

ScrollViewer または Pivot を回避することで、処理/オーバーライドするイベントがなくなり、意図したとおりに StackPanel 内のコントロールにアクセスできるようになりました。

「うまくいけば、それが他の人の助けになるかもしれません. :)

于 2012-04-28T02:16:38.460 に答える
0

まず、スクロールビューアーの意図した使用法は、スクロールビューアーとピボットの意図した設計を壊していると言えます (私を含む Windows Phone 開発者が犯したよくある間違い)。これが一般的に悪い習慣と見なされる主な理由は、ピボット コントロールとパノラマ コントロールによってのみ提供されることを意図した横方向のナビゲーション パラダイムを実装することです。

とはいえ、あなたの使い方が100%悪いというわけではなく、ルールを破ってもいい場合もあると思います。いくつかの調査を行い、ユーザーを混乱させたり、携帯電話のオペレーティング システムや適切に使用するアプリを通じて、ユーザーがまだ慣れていないナビゲーション パラダイムを強制的に学習させたりしないようにすることをお勧めします。 SDK によって提供されるコントロールの。

これがアプリにとって本当に最適な設計であると判断した場合は、目的を達成するために次の手順を実行する必要があります。

Horizo​​ntal ScrollViewer を使用する代わりに、Pivo​​t コントロール内で Pivot コントロールを使用します

内部スクロール セクションの上部領域でスペースを占有しないように、本質的に空のヘッダー テンプレートを作成する必要があります。

これは、達成しようとしている水平スクロールが連続スクロールではなく「セクション」によるものであるため、より理にかなっています。これにより、スクロールしているピクセル数を正確に考える必要がなくなります (代わりに、XAML を使用して PivotItems の幅を変更できます)。

ユーザーによるピボット スクロールのスクロール機能を無効にする

これは、さまざまな複雑さのさまざまな方法で実行でき、それ自体で質問する必要があります。これを実現する 1 つの方法については、こちらを参照してください。

もう 1 つ (より詳細に制御できます) 行うことは、内側のピボット項目でManipulationStartedManipulationDelta、およびイベントをキャプチャすることです。水平コンポーネントを含むデルタ操作を検出した場合は、イベントのメソッド ハンドラー内で を設定します。水平スクロールを処理する内部ピボットの機能をキャンセルします。次のようになります。ManipulationCompletedManipulationDeltae.Handled = true

// Event handler for ManipulationDelta event on your inner Pivot control
public void OnManipulationDelta(ManipulationDeltaEventArgs e)
{
    if(e.DeltaManipulation.Translation.X != 0)
        e.Handled = true;
}

後でわかるように、これにより奇妙な動作が発生する可能性があります。理想的には、自分のアプリにとって何が最適かを判断する必要がありますが、通常は、X コンポーネントで != 0 以外のものをチェックし、ユーザーがコントロールにヒットした場合に備えて、ユーザーに x の一部を許可する必要があります。 X コンポーネントの値が 1 になるような奇妙な角度で。

右または左に移動するボタンを実装します。

これは非常に単純です。Pivot.SelectedIndex プロパティを使用するだけです。

ただし、ほとんどの場合、これは悪い考えです。あなたが標準的な慣行の良い例外であることを本当に確認してください (できれば、アプリを使ったことがないが Windows Phone を持っている人にアプリを渡して、彼らがあなたのアプリの使い方を直感的に理解しているかどうかを確認してください.

于 2012-04-26T06:26:39.043 に答える