Wir verwenden Silverlight in einem Kiosk-Szenario. Gibt es eine Möglichkeit, die Rechtsklick-Funktion zum Aufrufen des Silverlight-Konfigurationsdialogs zu deaktivieren?
Antworten
Zu viele Anzeigen?//Im SharePoint habe ich einen kleinen Code hinzugefügt, der SP anweist, das Skript nach jedem Laden eines Teils auszuführen. Funktioniert wie ein Zauber :)
// EDIT
oder besser noch das Silverlight-Forum empfiehlt Ihnen dies zu tun: Silberlicht-Forum
<div id="silverlightObjDiv">
<!-- silverlight object here -->
</div>
<script>
_spBodyOnLoadFunctionNames.push ('setupElement');
function setupElement ()
{
document.getElementById('silverlightObjDiv').oncontextmenu = disableRightClick;
}
function disableRightClick(e) {
if (!e) e = window.event;
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
}
</script>
Wie Dain erwähnte, ist dies in Silverlight 4 problemlos möglich:
Machen Sie die Kontrolle fensterlos:
<param name="windowless" value="true" />
Fangen Sie den Rechtsklick in Ihrem Root-Gitter/Layout-Steuerelement ab:
public MainPage()
{
LayoutRoot.MouseRightButtonDown += (s, e) => { e.Handled = true; };
}
Der Haken
In Firefox und Chrome haben Sie die Wahl zwischen einem Kontextmenü または mit der Möglichkeit, mit dem Mausrad zu blättern. Leider kann man nicht beides haben, hoffentlich wird sich das in Silverlight 5 ändern.
In Silverlight 4 können Sie dies in C# tun, ohne sich mit HTML herumschlagen zu müssen und von diesem abhängig zu sein.
Das folgende Beispiel zeigt, wie man den Rechtsklick so implementiert, dass er tatsächlich von einem Steuerelement verwendet wird, aber man kann auch einfach eine Klickfalle erstellen, wenn man ihn nur deaktivieren möchte.
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
// wire up the event handlers for the event on a particular UIElement
ChangingRectangle.MouseRightButtonDown += new MouseButtonEventHandler(RectangleContextDown);
ChangingRectangle.MouseRightButtonUp += new MouseButtonEventHandler(RectangleContextUp);
}
void RectangleContextUp(object sender, MouseButtonEventArgs e)
{
// create custom context menu control and show it.
ColorChangeContextMenu contextMenu = new ColorChangeContextMenu(ChangingRectangle);
contextMenu.Show(e.GetPosition(LayoutRoot));
}
void RectangleContextDown(object sender, MouseButtonEventArgs e)
{
// handle the event so the default context menu is hidden
e.Handled = true;
}
}