2012-01-03 5 views
2

私はこのクリップでビングマップを持っている:クリッピングされたBingマップはScrollViewerで更新されませんか?

<my:Map.Clip> 
    <RectangleGeometry RadiusX="15" RadiusY="15" Rect="0,0,450,250" /> 
</my:Map.Clip> 

マップは、下部のどこかScrollViewerのであり、それの半分だけが表示されます。 問題は、地図全体を表示するために上にスクロールすると、表示されなかったマップの部分が黒になります。

マップにクリップがない場合、この問題は発生しません。それは正しくレンダリングされます。 これはコントロールのバグですか、何か間違っていますか? 誰でもこの問題が以前に発生しましたか?

更新:私はこれを実証するための小さなサンプルプロジェクトを作った:link。また、これを実行している間、マップコントロールがグリッドの内側にある場合にのみ問題が発生することに気付きました。私はScrollViewerにまっすぐ置くだけでうまくいきます。

更新:グリッド行の固定高さを設定しても効果はありません。また、スタックパネル内にグリッド+マップを配置してからスクロールビューア内に配置すると機能しません。あなたはこれを修正するために何かを見つけましたか?

答えて

1

と対話したくない場合は、これは何の関係もありません代わりに、Bingのマップコントロールの静的Bing MapsのAPIを使用してみてくださいScrollViewerではなくジェスチャーをキャプチャしたマップでは、ユーザーがスクロールを開始する場所に関係なく、マップは元のクリップを維持します。

この動作の理由は、Silverlightコントロール(およびWebBrowserコントロールも)にネイティブレンダリングコンポーネントが含まれているためです。例えば、WebBrowserは、TileHostin this articleと記載されている)を有する。このため、RenderTransformsなど、さまざまなSilverlightフレームワークエフェクトをマップに適用することはできません。

問題を解決するには、ユーザーがスクロールしたときにマップを強制的に再レン​​ダリングする必要があります。これを行うには、ScrollViewerScrollBarLinq-to-VisualTreeで検索します。ユーザーがスクロールすると、非常に小さなズームがマップに適用されます。これにより、再レンダリングが行われます。

using System.Linq; 
using System.Windows; 
using System.Windows.Controls.Primitives; 
using LinqToVisualTree; 
using Microsoft.Phone.Controls; 

namespace BingMapClipIssueDemo 
{ 
    public partial class MainPage : PhoneApplicationPage 
    { 
     // Constructor 
     public MainPage() 
     { 
      InitializeComponent(); 

      this.Loaded += new RoutedEventHandler(ContentPanel_Loaded); 
     } 

     void ContentPanel_Loaded(object sender, RoutedEventArgs e) 
     { 

      ScrollBar verticalScroll = ContentPanel.Descendants<ScrollBar>() 
          .Cast<ScrollBar>() 
          .Where(sb => sb.Orientation == System.Windows.Controls.Orientation.Vertical) 
          .Single(); 

      verticalScroll.ValueChanged += (s, e2) => 
      { 
       map.ZoomLevel = map.ZoomLevel + 0.00001; 
      }; 

     } 
    } 
} 

上記のコードをあなたの例にドロップすると動作します。

+0

これは実際には機能するかもしれません。私は明日私のPCに着くと、それがどのように動作するかを教えてくれます。 –

+0

あなたのソリューションを使ってみましたが、残念ながらWP7プロジェクトでLinqToVisualTreeを使用することができませんでした。 –

+0

どうしてですか?単にコードをカットアンドペーストするか、wp7contribの一部としてダウンロードしてください。 – ColinE

2

ScrollViewer、Pivo​​t、Panorama、またはパン/スクロールジェスチャーをキャプチャする他のコントロールにBing Mapコントロールを含めないでください。これは、ジェスチャがマップまたはホスティングコントロールによってキャプチャされるかどうかをユーザが知らないため、ユーザ体験が非常に貧弱になる。私が考えていることは、スクロールするときにScrollViewerをスクロールせず、マップをパンしているということです。

+0

申し訳ありませんが、私はあなたが私の問題を理解したとは思いません。問題は誰がスクロールをキャプチャするのではなく、ScrollViewerでスクロールダウンしてマップ全体を表示すると、マップの下部が黒く表示され、レンダリングされないという事実です。私はこれを実証するための小さなサンプルプロジェクトを作成しました:[リンク](http://dl.dropbox.com/u/20848147/Stack%20Overflow/BingMapClipIssueDemo.zip)。また、これを実行している間、マップコントロールがグリッドの内側にある場合にのみ問題が発生することに気付きました。私はScrollViewerにまっすぐ置くだけでうまくいきます。 –

+0

Colinはまだまったく正しいですが、***あなたはScingViewer内にBing Mapコントロールを配置してはいけません。物語の終わり。 –

+0

あなたのための物語の終わりは、私のためではないかもしれません。スクロールビューアでその地図が必要です。あなたはとにかくそれとやりとりすることはできませんが、それは誰もパン/スクロールのジェスチャーをキャプチャすることに問題はないので、そこには、ピンを表示するだけです。興味深い。 –

関連する問題