2012-06-20 13 views
9

Bazen bir şeye yaklaşık 3.000 piksel genişliği için, uygulamada MusicBg değişikliklerin büyüklüğünün kullanımı sırasında buDikdörtgenin sonuna ulaştığında kaydırma işlemini durdurmak için bir Dikdörtgen İçeren ScrollViewer'ı nasıl alabilirim?

<ScrollViewer ManipulationMode="Control" x:Name="songScrollViewer" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled" Height="270" VerticalAlignment="Center" Width="728" Canvas.Top="20" d:LayoutOverrides="HorizontalMargin" > 
    <Rectangle x:Name="musicBG" Fill="#FF0692FD"/> 
</ScrollViewer> 

gibi ScrollViewer içinde bir Dikdörtgen oluşturduk. ScrollViewer kaydırma yaparken

musicBG.Width = _songLength*PixelsPerSecond 

Ancak, benim tüm yol ekranın dışına dikdörtgen kaydırmak için izin verir.

Örneğin bu kod satırı, dikdörtgeni taşımak istediğim yere taşıdığımda aşağıdaki değerleri verir.

if (songScrollViewer.HorizontalOffset > songScrollViewer.ScrollableWidth) 

HorizontalOffset ~ 1200 arasında bir değere sahiptir ve scrollableWidth yaklaşık ~ 2900 arasında bir değere sahiptir.

Dikdörtgenin tamamen ekrandan kaydırılmaması için bu işlemin düzgün yapılmasını nasıl sağlayabilirim?

Yaklaşık 1200 piksellik bir HorizontalOffset öğesinin, dikdörtgeni yalnızca hedefin yarısına doğru itmesi ve ekrandan çıkmaya başlaması için beklenmez.

CEVAP:

çok hayal kırıklığı sonra ben Tuval yerine Sınır veya Dikdörtgen kullanarak bu sorunu çözmek başardı. Herkes bu sorunun neden olduğunu açıklayabilirse ve tuvalden daha iyi çalışacak daha az işlemci yoğun kontrol varsa, puan vereceğim.

Düzenleme: Ekran görüntüleri:

Kötü Kodu: bad scroll

İyi çalışma kodu:

<ScrollViewer ManipulationMode="Control" x:Name="songScrollViewer" Width="720" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled" Height="270" VerticalAlignment="Top" Canvas.Top="20" HorizontalAlignment="Left" > 
       <Canvas x:Name="musicBG" Background ="#FF0692FD" Height="270" > 
        <Border Background="#FF0692FD" VerticalAlignment="Top" HorizontalAlignment="Left" Height="270" /> 
       </Canvas> 
      </ScrollViewer> 

İyi kötü kod ile kötü kaydırma

<ScrollViewer ManipulationMode="Control" x:Name="songScrollViewer" Width="720" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled" Height="270" VerticalAlignment="Top" Canvas.Top="20" HorizontalAlignment="Left" > 
            <Border x:Name="musicBG" Background="#FF0692FD" VerticalAlignment="Top" HorizontalAlignment="Left" Height="270" /> 

      </ScrollViewer> 

Görüntü Kaydırma: 170 sn diyor Kötü kaydırmada 118 saniye yerine sağ alt kısma koyar. good scroll

+0

Görselleştirmeye yardımcı olmak için tanımladığınızın ekran görüntüsünü atmak istiyorsanız, başarmaya çalıştığınız şeyden emin olabilirim, o zaman evet, bulunduğunuz nesnelerden herhangi birini kullanabilmeniz gerekir. zaten çalışıyor ancak ScrollViewer'ın ViewPort'una bir boyut bağlamanız gerekebilir ve hatta bir ofset gerektirmeyebilir. Şu anda açıklamanızın görselleştirilmesi zor olsa da, eminim ki bunu çözebiliriz. –

+0

@ChrisW. Soru güncellendi. – Bob

+1

Bu çok garip, dikdörtgen 2000'den sonra büyüyene kadar mükemmel çalışıyor ve sonuna kadar ilerlediğinizde ekranı daha da ileriye doğru itmeye başlıyor. Merakımı yakaladınız .... – methodMan

cevap

1

Doğru olduğuna inanıyorum, wp7 daha sonra 2048 pikselden daha büyük şekiller oluşturmaz. Bu yüzden sayfanın kaydırılmasının sebebi, 2048'den sonra olduğu gibi davranıyor, ancak 2048 piksellik bir genişliğe kadar görebiliyorsunuz ve sadece dikdörtgenin "hayalet" kısmına geçiyor.

Bunu geçersiz kılabileceğinden emin değilim, ancak gelebileceğim en iyi çözüm (geçersiz kılmadan), dikdörtgeni 2000'den sonra daha küçük olan (yalnızca güvende olmak üzere) mandrenlere bölerek ve sonra bunları görüntüleyerek kaydırma görüntüleyicinin içinde yatay bir yığın panelinde sorunsuzca. Bununla ilgili problem, nasıl kodlandığınıza bağlı olarak, bu çözümün uygulanması zor olabilir; ancak bunu görüntülerken ViewModel'inize bölebilirsiniz ve mantığınız sadece büyük bir yığın olarak görülebilir.