2009-05-09 2 views
5

У меня есть приложение silverlight, которое я хочу разрешить размер, как обычная HTML-страница. То есть, я хочу, чтобы размер плагина silverlight расширялся и сокращался по высоте, чтобы разместить динамические данные и элементы управления, которыми я заполняю приложение silverlight. Итак, скажем, у меня есть страница с сеткой и кнопка. Пользователь нажимает кнопку, и сетка получает кучу строк с изображениями, делающими естественный размер сетки выше, чем окна браузера. Я хотел бы иметь что-то на месте, чтобы изменить размер плагина silverlight, чтобы удовлетворить желаемый размер сетки. Далее, и некоторые другие попытки, не работают:Silverlight с динамической высотой

// handler in my main page. 
void MainGrid_LayoutUpdated(object sender, EventArgs e) 
{ 
    HtmlPage.Window.Invoke("setSilverlightSize", this.MainGrid.DesiredSize.Height); 
} 

<body style="height:100%;margin:0;"> 
    <form id="mainForm" runat="server" style="height:100%;"> 
     <asp:ScriptManager ID="ScriptManager" runat="server"></asp:ScriptManager> 
     <div id="SilverlightContainer" style="height:100%;"> 
      <asp:Silverlight ID="SLMain" runat="server" Source="~/ClientBin/My.Silverlight.Main.xap" Version="2.0" Width="100%" Height="100%" /> 
     </div> 
    </form> 
    <script type="text/javascript"> 
     function setSilverlightSize(val) { 
      var host = document.getElementById("SilverlightContainer"); 
      host.style.height = val + "px"; 
     } 
    </script> 
</body> 

Нужный размер MainGrid всегда хочет быть размер окна. Арг сказал пирату. не

-r

ответ

2
  1. Установите переполнение «авто»
  2. Установите свиток «нет»
  3. Установите маржу «0»
  4. Установите ширину объемлющего Div в высоту и до "100%"
  5. Установить ширину и высоту элемента управления Silverlight "100%"

Это должно охватывать все ваши базы. Ниже приведено несколько примеров HTML.

Попробуйте это:

<style type="text/css"> 
html, body { overflow:auto } 
</style> 
<head> 
    <title>My App</title> 
</head> 
<body id="bodyId" style="margin:0;" scroll="no"> 
    <form id="form1" runat="server"> 
     <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
     <div style="position: fixed; height: 100%; width: 100%"> 
      <avn:Silverlight 
       ID="xamlHost" 
       runat="server" 
       Source="~/ClientBin/THE.xap" 
       MinimumVersion="x.x.xxxxx" 
       Width="100%" 
       Height="100%" 
       /> 
     </div> 
    </form> 
</body> 
</html> 
+1

В этом случае плагин silverlight не подходит для размещения контента. В случае, когда мой контент больше, чем окно браузера, я бы хотел, чтобы плагин серебристого цвета, если необходимо, за границы окна браузера, чтобы отображать полосы прокрутки. В вашем примере плагин масштабируется с окном браузера, а не с содержимым silverlight. – ptoinson

+0

Я вижу, это поднимает старый вопрос о том, кто должен отвечать за прокрутку браузера? или Silverlight? Я обнаружил, что гораздо проще обрабатывать прокрутку содержимого из Silverlight. Именно поэтому я использую вышеуказанный контейнер HTML, чтобы гарантировать, что только элемент управления Silverlight выполняет прокрутку.Если вы этого не сделаете, вы можете столкнуться с гнусным сценарием с двойной полосой прокрутки. – markti

+0

К сожалению, я хочу использовать режим без окон для silverlight, который не позволяет захватить мышь вне плагина. Использование прокрутки Silverlight здесь является ошибкой. – ptoinson

1

Я использовал это и кажется, работает хорошо. Необходимо получить размер рендера «ed».

private void LayoutRoot_LayoutUpdated(object sender, System.EventArgs e) 
{ 
    // Set the size of the SL object to the new rendered size of the Grid. 
    ResizeSilverlightOnject(this.LayoutRoot.RenderSize.Height); 
} 

private void ResizeSilverlightObject(double height) 
{ 
    HtmlPage.Window.Invoke("ResizeObject", new object[] { height }); 
} 
+0

Я пытался это решение, но, похоже, получаю ошибку ... «Исключение типа« Исправление System.ExecutionEngineException »было брошено». когда приложение запускается. – Justin

+0

Для справки приведен код на стороне Silverlight. public MainPage() { InitializeComponent(); LayoutRoot.LayoutОбновлен + = новый EventHandler (LayoutRoot_LayoutUpdated); } частная пустота LayoutRoot_LayoutUpdated (объект отправителя, EventArgs е) { HtmlPage.Window.Invoke ("ResizeSilverlightContainer", новый объект [] {this.LayoutRoot.RenderSize.Height}); } – Justin

0

Если вы пытаетесь определить высоту с помощью Validation Резюме (немного не связанное с этим вопросом, но полезно), попробуйте следующее: В вашем Page.xaml.cs // сохранить исходную высоту в Page_Loaded событие

void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
     SetupPage(); 
     this.ValidationSummary.SizeChanged += new SizeChangedEventHandler(ValidationSummary_SizeChanged); 
} 
void ValidationSummary_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     if (this.OriginalPageHeight == 0.0) 
     { 
      this.OriginalPageHeight = this.RenderSize.Height; 
     } 
     else 
     { 
      double expandSize = this.OriginalPageHeight + e.NewSize.Height; 
      ResizeSilverlightObject(expandSize); 
     } 
    } 

EDIT: добавлены функции Javascript и функции CS

function ResizeObject(height) { 
     var host = document.getElementById("uploaderHost"); 
     host.style.height = height + "px"; 
    } 

public void ResizeSilverlightObject(double height) 
    { 
     HtmlPage.HtmlWindow.Invoke("ResizeObject", new object[] { height }); 

    } 
1

В моем случае я создаю событие и я посылаю высота данных в моем браузере, чтобы обрабатывать значение высоты от JavaScript Это мой HTML-код:

/* 
When Silverlight is loaded attach silverlight events 
*/ 
function OnSilverlightLoaded(sender, args) { 
    //Getting Silverlight object on page 
    _silverlightControlHost = document.getElementById("SilverlightObject"); 
    //Subscribe to it events 
    _silverlightControlHost.Content.SilverlightApp.SetHeightEvent = SetHeightEvent; 
} 

И это мой Silverlight код:

[ScriptableType] 
public partial class MainPage 
{ 
    //Register the event to be as accessible from script 
    [ScriptableMember] 
    public event EventHandler<HeightEventHandler> SetHeightEvent; 

    public MainPage() 
    { 
     InitializeComponent(); 

     //Register this instance to be accessible from script 
     HtmlPage.RegisterScriptableObject("SilverlightApp", this); 
    } 

    public void SomeMethod() 
    { 
     if (this.SetHeightEvent != null) 
      this.SetHeightEvent(this, new HeightEventHandler() { Altura = _heightSilverObj.ToString() }); 
    } 
} 

[ScriptableType] 
public class HeightEventHandler : EventArgs 
{ 
    public string Altura { get; set; } 
} 

Это работает!