Silverlighti hiire tugi piirdub järgnevate sündmustega:
Nagu näha hiire kerimisnupu sündmusi nende hulgas ei ole. Aga kuidas öeldaksegi, kui kuidagi ei saa, siis kuidagi ikka saab.
Silverlighti üks vingemaid omadusi on väga hea läbisaamine rakendust hostiva veebilehega. Tänu klassidele HtmlPage, HtmlDocument ja HtmlWindow saab selle hostlehega praktiliselt kõike teha – muuta DOMi ning ka kinnituda ka sündmuste külge, mida läbi Silverlighti kätte ei saa.
Kõigepealt defineerime kolm (kõigi erinevate veebilehitsejate jaoks) sündmusekuularit:
HtmlPage.Window.AttachEvent("DOMMouseScroll", OnMouseWheel); HtmlPage.Window.AttachEvent("onmousewheel", OnMouseWheel); HtmlPage.Document.AttachEvent("onmousewheel", OnMouseWheel);
Meetodi OnMouseWheel argumendina saame tüüpilise Html sündmuse atribuutide jada ning sealt omakorda info selle kohta kui palju hiire kerimisnuppu keriti. Kuna üldiselt meid huvitab vaid suund, siis taandame kerimisfaktori meetodiga Math.Sign kas +1 või -1ks. Vastavalt sellele numbrile saame, siis vajalikke asju kerida, liigutada, zoomida jms.
private void OnMouseWheel(object sender, HtmlEventArgs args) { double mouseDelta = 0; ScriptObject e = args.EventObject; // Mozilla, Safari if (e.GetProperty("detail") != null) { mouseDelta = ((double)e.GetProperty("detail")); } // IE & Opera else if (e.GetProperty("wheelDelta") != null) { mouseDelta = ((double)e.GetProperty("wheelDelta")); } // -1 or +1 mouseDelta = Math.Sign(mouseDelta);
Demomiseks on lihtne rakendus, mille paigutushalduriks on ScrollViewer ning mille sees on andmetabel. Andmetabel on üks selliseid asju, mida oleks tore hiirega kerida …
<ScrollViewer x:Name="LayoutRoot"> <my:DataGrid x:Name="myDatagid" AutoGenerateColumns="True" RowBackground="LightSteelBlue"
AlternatingRowBackground="Azure" /> </ScrollViewer>
Lisades esimesele koodilõigule vaid ühe rea:
LayoutRoot.ScrollToVerticalOffset(LayoutRoot.VerticalOffset + 100 * mouseDelta);
Saabki meie andmetabel keritavaks.
Lõpptulemus on näha siin:
http://silverlight.services.live.com/invoke/60908/Scroller/iframe.html
Andmed tulevad tabelisse kasutades sellist koodi:
myDatagid.ItemsSource = inimesed;
Ainus tingimus on, et see <inimesed>, oleks IEnumerable, ehk siis mingit tüüpi list.
Siin on tegemist Inimese klassi objektide listiga
public class Inimene { public string Eesnimi { get; set; } public string Perenimi { get; set; } public int Vanus { get; set; } public string Elukoht { get; set; } }
List<Inimene> inimesed = new List<Inimene>();
Lae lähtekood: