2009-12-14 7 views
2

Voici le problème ...Commande Silverlight de taille dynamique sur la page Web

J'ajoute quelques contrôles silverlight 3 à une application ASP.Net Web Forms. La hauteur de l'application Silverlight peut changer en fonction de la quantité de données qu'il contient. L'application fait partie d'une page Web et non de toute la page. Mes utilisateurs souhaiteraient n'avoir qu'un seul jeu de barres de défilement. Existe-t-il un moyen de dimensionner dynamiquement le div ou l'objet en fonction du suze de l'application Silverlight?

Par exemple puis-je me connecter au javascript silverlight pour le faire d'une manière ou d'une autre?

Répondre

1

Il y a deux façons de le faire: soit en accédant à l'élément DOM directement et changer son style (ou css) attributs, ou en appelant une fonction javascript sur la page qui fera la même chose. Ci-dessous j'ai le xaml, le code derrière, et le HTML pour un exemple simple qui lorsque vous faites glisser un curseur dans le contrôle silverlight, il redimensionne la div qui contient le contrôle. Si vous créez une application Silverlight simple avec un site Web et une page de test complémentaires, puis copiez et collez le code suivant, vous pouvez avoir une lecture (notez que j'ai extrait certains styles/scripts de la page aspx pour le plaisir de concision).

Le code C# et javascript n'est pas particulièrement joli ou à l'épreuve des balles, c'est simplement un exemple.

<UserControl x:Class="SilverlightApplication6.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="200" d:DesignHeight="480"> 
    <Grid x:Name="LayoutRoot"> 

     <Slider x:Name="WidthSlider" Value="50" Maximum="200"></Slider> 

    </Grid> 
</UserControl> 

code derrière l'application Silverlight:

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

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

    private void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     WidthSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(WidthSlider_ValueChanged); 
    } 

    private void WidthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 
     //access and manipulate the DOM element directly: 
     HtmlElement container = HtmlPage.Document.GetElementById("silverlightControlHost"); 
     if (container != null) 
     { 
      container.SetStyleAttribute("width", (50 + e.NewValue).ToString() + "px"); 
     } 

     //pass a delta value to the js function, which will get added to the current width of the container: 
     HtmlPage.Window.Invoke("resizeContainer", (e.NewValue - e.OldValue).ToString()); 
    } 
} 

et la page ASPX:

<%@ Page Language="C#" AutoEventWireup="true" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>SilverlightApplication6</title> 
    <script type="text/javascript" src="Silverlight.js"></script> 
    <script type="text/javascript"> 
     function resizeContainer(delta) { 
      var container = document.getElementById('silverlightControlHost'); 
      if (container != null) { 
       //alert('starting width: ' + container.style.width); 
       container.style.width = (parseInt(container.style.width) + Number(delta) + 'px'); 
       //alert('finishing width: ' + container.style.width); 
      } 
     } 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server" style="height:100%"> 
    <div id="silverlightControlHost" style="border: solid 1px red; width:200px; height: 400px;"> 
     <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> 
      <param name="source" value="ClientBin/SilverlightApplication6.xap"/> 
      <param name="onError" value="onSilverlightError" /> 
      <param name="background" value="white" /> 
      <param name="minRuntimeVersion" value="3.0.40624.0" /> 
      <param name="autoUpgrade" value="true" /> 
      <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none"> 
       <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/> 
      </a> 
     </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div> 
    </form> 
</body> 
</html> 

Edit: Deux jours après avoir écrit cette réponse Charles Petzold a écrit un billet de blog sur le redimensionnement des contrôles Silverlight dans la page html, you can find it here. La principale différence est qu'il redimensionne le contrôle plugin Silverlight réel, alors que je redimensionnais l'élément html que le plugin Silverlight réside à l'intérieur.

1

Je fais quelque chose de similaire avec un contrôle silverlight que j'ai fait. Mon problème était que j'avais un contrôle pour montrer des scans de document dans un contrôle silverlight et j'avais la taille codée en dur mais certains utilisateurs couraient à une résolution beaucoup plus haute ainsi ils avaient beaucoup d'espace gaspillé qu'ils pourraient employer.

J'ai donc implémenté une petite fonction javascript côté client qui détermine la taille optimale pour le contrôle. Ce code s'exécute au chargement de la page.

Au bas de votre page HTML ajoutez le code suivant (en utilisant Jquery):

<script type="text/javascript" language="javascript"> 
    function InitializeSilverlightControlHeight() 
    { 
     $(function() 
     { 
      var miniumimControlSize = 500; 
      var pagePadding = 150; 
      var screenheight = $(window).height() - pagePadding; 
      if (screenheight > miniumimControlSize) 
      { 
       $("#yourSilverLightControlName").height(screenheight); 
      } 
     }); 
    } 

    InitializeSilverlightControlHeight(); 
</script> 

Qu'est-ce que cela ne se vérifie la taille visible de la fenêtre du navigateur et les moins le montant de remplissage (qui dans mon cas est 150px pour tenir compte de la hauteur de l'en-tête). Si cette taille est supérieure à la taille minimale du contrôle, le contrôle est défini sur cette taille.

Espérons que cela aide ou du moins vous oriente dans une direction générale pour vous aider à démarrer.

+0

Pas tout à fait ce que je cherchais, merci cependant. Mes utilisateurs souhaitent que le contrôle Silverlight s'agrandisse et défile uniquement avec les barres de défilement du navigateur. Donc, j'ai besoin d'obtenir la hauteur de l'application SL et de la transmettre au navigateur en quelque sorte. – Gus

0

Ne pense pas que ce soit tout à fait ce que vous cherchez, mais il pourrait aider ...

Dans le cteur de votre première page votre contrôle silverlight vous crée pouvez ajouter un événement

App.Current.Host.Content.Resized += new EventHandler(Content_Resized);

Ensuite, dans votre écouteur d'événement, vous pouvez redimensionner le contrôle pour mieux l'adapter à la fenêtre.

void Content_Resized(object sender, EventArgs e) 
{ 
    double height = App.Current.Host.Content.ActualHeight; 
    double width = App.Current.Host.Content.ActualWidth; 
    this.Height = height; 
    this.Width = width; 
    m_currentPage.Height = height; 
    m_currentPage.Width = width; 
} 

Hope qui aide = D

Questions connexes