GAAnalytics4

2009-09-02

Silverlight da Scroll Problemi



Silverlight da bir çok bileşende fare tekeri ile scroll olayının olmadığı görürsünüz.Nedeni browser'in fare tekerleği eventine silverlightdan bağlanılamamasıdır.
Örnek olarak bir treeview'in yapalım:
Ağaç yüklendikten sonra eğer browser içindeysek browser'in onmousewheel/DOMMouseScroll eventlerine bağlanalım ve gerkli scroll olayını mouse tekeri döndüğünde gerçekleştirelim..

Private Sub tvAgac_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles tvAgac.Loaded
If System.Windows.Browser.HtmlPage.IsEnabled Then 'browser içindeysek
System.Windows.Browser.HtmlPage.Document.AttachEvent("onmousewheel", AddressOf Tekerlek)'ms event
System.Windows.Browser.HtmlPage.Window.AttachEvent("onmousewheel", AddressOf Tekerlek)'ms event
System.Windows.Browser.HtmlPage.Window.AttachEvent("DOMMouseScroll", AddressOf Tekerlek)'ff/gecko/vb event
System.Windows.Browser.HtmlPage.Window.AttachEvent("DOMMouseScroll", AddressOf Tekerlek)'ff/gecko/vb event
End If
End Sub
Private Function TekerlekVerisi(ByRef eO As System.Windows.Browser.ScriptObject) As Decimal
If System.Windows.Browser.HtmlPage.IsEnabled Then
'eo ile browser event nesnesi
Dim sign As Integer = 1
Dim tip = "wheelDelta"'ms ve operada alınacak dğer
Dim tip2 = "detail"'diğerleri içim
Dim val As Object = eO.GetProperty(tip)
If IsNothing(val) Then
val = eO.GetProperty(tip2)
sign = -1'ms/opera harici teker çevrilme yönünü ters algılıyor.
End If
If Not IsNothing(val) Then
Try
Return Decimal.Parse(val.ToString) * sign
Catch ex As Exception
End Try
Else
System.Windows.Browser.HtmlPage.Window.Alert("Değer yok")
End If
End If
Return 0D
End Function
Private Sub Tekerlek(ByVal sender As Object, ByVal e As System.Windows.Browser.HtmlEventArgs)
'bakalım istek nerden gelmiş
Dim obj As Object = e.EventObject.GetProperty("srcElement")'ms için
If obj Is Nothing Then obj = e.EventObject.GetProperty("target")'diğerleri için
If Not obj Is Nothing AndAlso TypeOf obj Is System.Windows.Browser.HtmlElement Then
With DirectCast(obj, System.Windows.Browser.HtmlElement)
If Not .TagName.ToLower.StartsWith("obj") Then Exit Sub'eğer object tagindan gelmiyorsa çıkalım
End With
End If
Dim temp As System.Windows.Automation.Peers.AutomationPeer = System.Windows.Automation.Peers.FrameworkElementAutomationPeer.FromElement(Me.tvAgac)
If temp Is Nothing Then
temp = System.Windows.Automation.Peers.FrameworkElementAutomationPeer.CreatePeerForElement(Me.tvAgac)
End If
If Not temp Is Nothing Then
Dim isp As System.Windows.Automation.Provider.IScrollProvider = temp.GetPattern(Automation.Peers.PatternInterface.Scroll)
If Not isp Is Nothing Then
Dim val As Decimal = TekerlekVerisi(e.EventObject)
If val <> 0 Then
e.PreventDefault()
Try
If val > 0 Then'yöne göre scroll'i döndürelim
isp.Scroll(Automation.ScrollAmount.NoAmount, Automation.ScrollAmount.SmallDecrement)
Else
isp.Scroll(Automation.ScrollAmount.NoAmount, Automation.ScrollAmount.SmallIncrement)
End If
Catch ex As Exception
End Try
End If
End If
End If
End Sub