0

   我有一个全屏的 Silverlight 应用程序 (VS2010/C#)。
   我还有一个位于 Silverlight 应用程序之上的 html 控件。

   当浏览器窗口最大化时,位置是正确的。但是,当我将窗口恢复到较小的尺寸时,我会得到 silverlight 应用程序的滚动条(如预期的那样)。当我向下滚动时,我的 html 不会滚动并且相对于其窗口位置保持浮动。我希望 html 与 silverlight 应用程序一起滚动。如何才能做到这一点?

   出于业务流程的原因,我无法将 html 放入 silverlight 应用程序中。

这是我的样式表

<style type="text/css">
    html, body
    {
        height: 100%;
        overflow: auto;
    }
    body
    {
        padding: 0;
        margin: 0;
    }
    #silverlightControlHost
    {
        height: 100%;
        text-align: center;
        position: absolute;
        width: 100%;
        left: 0px;
        top: 0px;
    }
    #contentDiv
    {
        position: absolute;
        top: 15px;
        right: 30px;
        display: inline;
        z-index: 20000;
    }
</style>

这是我的html代码

<form id="form1" runat="server" style="height:100%">
    <div runat="server" id="contentDiv">
        --HTML CONTROLS
    </div>
    <div id="silverlightControlHost">
        <object id="silverlightControl" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
              <param name="windowless" value="true"/>
              <param name="enablehtmlaccess" value="true" />
      <param name="onError" value="onSilverlightError" />
      <param name="background" value="white" />
      <param name="minRuntimeVersion" value="4.0.50826.0" />
      <param name="autoUpgrade" value="true" />
      <a href="http://www.microsoft.com/GETSILVERLIGHT" style="text-decoration:none">
           <img src="http://go.microsoft.com/fwlink/?LinkId=161376" 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>

   预先感谢您在此提供的任何帮助。

   我觉得出现的滚动条属于 silverlight 应用程序,这就是为什么滚动 html 内容时似乎浮动,但我一直无法证实这一理论。

~~~编辑~~~

   已确认滚动条属于 Silverlight 实例。为了确认这一点,我通过在 CSS 中设置一个大的“LEFT”和“TOP”属性将我的 html 控件位置设置为最右边和最底部。
   此时,浏览器和 Silverlight 应用程序在调整大小时都会出现滚动条。浏览器和 silverlight 应用程序的滚动条是不同的样式。
   重置 LEFT 和 TOP 属性并重现原始问题后,出现的滚动条与 Silverlight 应用程序具有相同的样式,而不是窗口。因此,所有滚动都发生在 Silverlight 应用程序本身上。

   向前推进的解决方案可能是打破业务流程并将 html 嵌入到 Silverlight 中。如果有人能想出一种不同的方法来实现这一点,将不胜感激。

4

1 回答 1

0

通过捕获滚动事件,我能够调整控件的顶部属性并允许滚动效果。这是解决方案的基础。

注意:svMainViewer是MainShell.xaml页面中的滚动View

C# MainShell.xaml.cs 代码

public partial class MainShell : UserControl
{
    #region Private Variables
    private double svHorizontalOffset;
    private double svVerticalOffset;
    #endregion

    #region Constants
    const string JAVASCRIPT_FUNCTION_VERTICALOFFSETCHANGED = "SilverlightScrollViewerVerticalOffest";
    const string JAVASCRIPT_FUNCTION_HORIZONTALOFFSETCHANGED = "SilverlightScrollViewerHorizontalOffest";
    #endregion
    public MainShell(IUnityContainer container)
    {
        InitializeComponent();

        #region Code required registering scroll bar offset notifications
        NotificationHelper.RegisterForNotification("HorizontalOffset", svMainShell, OnHorizontalOffsetChanged);
        NotificationHelper.RegisterForNotification("VerticalOffset", svMainShell, OnVerticalOffsetChanged);
        #endregion
    }

    #region Methods using dependency properties
    public void OnHorizontalOffsetChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        svHorizontalOffset = double.Parse(e.NewValue.ToString());
        System.Windows.Browser.HtmlPage.Window.Invoke(JAVASCRIPT_FUNCTION_HORIZONTALOFFSETCHANGED, svHorizontalOffset);
    }

    public void OnVerticalOffsetChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        svVerticalOffset = double.Parse(e.NewValue.ToString());
        System.Windows.Browser.HtmlPage.Window.Invoke(JAVASCRIPT_FUNCTION_VERTICALOFFSETCHANGED, svVerticalOffset);
    }
    #endregion

}

public class NotificationHelper
{
    public static void RegisterForNotification(string property, FrameworkElement frameworkElement, PropertyChangedCallback OnCallBack)
    {
        Binding binding = new Binding(property)
        {
            Source = frameworkElement
        };

        var dependencyproperty = System.Windows.DependencyProperty.RegisterAttached("ListenAttached" + property,
                                 typeof(object), typeof(UserControl), new System.Windows.PropertyMetadata(OnCallBack));

        frameworkElement.SetBinding(dependencyproperty, binding);
    }
}

Javascript 代码片段

function SilverlightScrollViewerVerticalOffest(offset) 
{
        contentDivElement = document.getElementById("contentDiv");
        if (contentDivElement != null && contentDivElement.style.display != 'none') 
        {
            contentDivElementTop = 15 - offset;
            contentDivElementTop += 'px';
            contentDivElement .style.top = contentDivElementTop ;
        }
}

您可以在 Weareon 的博客http://blog.weareon.net/scrollviewer-scroll-change-event-in-silverlight/上找到有关我实现的代码的更多详细信息

于 2013-04-03T16:02:08.553 回答