4

xslt Webパーツと質問に関係のない2番目のWebパーツを持つsharepointページを作成しました

この 2 番目の Web パーツを追加すると、リボン バーが非表示になり、Web パーツをクリックしてリボン バーを再度表示する必要があります。Web パーツをクリックすることは、ユーザーに要求できることではないため、xslt リストビュー Web パーツのコンテキストで常にリボン バーを表示できるようにしています。

この問題を検索すると、SharePoint ソース コードでリフレクターを使用したこの非表示のリボン動作を検索すると、以下の例に示すように、これは Microsoft によって設計された動作であることがわかりました。

public override bool Visible { 
get {
if (!this.SingleWebPartPresentOnPage)
return false;
else
return base.Visible; 
} 
}

同じ問題を抱えているが解決策がない人: http://www.glynblogs.com/2011/02/list-view-selector-missing-with-multiple-web-parts-in-sharepoint-2010.html

サーバー側のコードでリボン バーを強制的に表示することはできますか? または、Web パーツをクリックしてリボン バーを表示するときに使用されている JavaScript コードを呼び出すことはできますか?

xslt Webパーツをクリックするとリボンが表示されますが、実行中のコードを再現できないため、javascriptで可能であると思います。

4

5 に答える 5

0

Thorstens のソリューションと同様に、jQuery を使用して、mouseenter イベントで WpClick 関数を起動します。このアプローチは、ユーザーが最初にページに入ってメニューの 1 つを使用しようとしたときにフル ツールバーがフリークアウトする問題にも対処します。必要に応じて、ページ上の任意の数の Web パーツに対してイベント バブルをトラップできます。例えば:

$("body").on("mouseenter","#MSOZoneCell_WebPartWPQ2,#MSOzoneCell_WebPartWPQ3, . . . etc.",function() {
  WpClick(event);
});

ここで、"body" は、ホバリング時に自動選択する Web パーツを含む任意の親要素にすることができます。

関心のある Web パーツが 1 つだけの場合、または大きなページで最適なパフォーマンスを得るには、イベントをゾーンに直接設定することもできます。

$("#MSOZoneCell_WebPartWPQ2").attr("onmouseenter","WpClick(event)");

またはjQueryが利用できない場合

var el = document.getElementById("MSOZoneCell_WebPartWPQ2"); 
if(el != null) {
  el.setAttribute('onmouseenter','WpClick(event);');
}

必要に応じて、イベントを手動でトリガーすることにより、ページが読み込まれた後、ユーザーがホバーする前に、リボンを強制的に表示することができます。上記のイベントを添付した後、適切なコードを含めるだけです。たとえば、jQuery を使用して

$("#MSOZoneCell_WebPartWPQ2").mouseenter();
于 2014-03-11T21:25:44.077 に答える
0

優れた解決策は、ビュー ページのメイン Web パーツの contextualInfo を取得することです。

public class MyView : WebPart, IWebPartPageComponentProvider 
{

      protected override void CreateChildControls(){.............}
      public WebPartContextualInfo WebPartContextualInfo
      {
            get
            {
                // get default current view webart (WebPartWPQ2)
                ListViewWebPart listView = this.WebPartManager.WebParts
                     .OfType<ListViewWebPart>().FirstOrDefault();
                // use reflection to get non-public member containing contextualinfo
                var t = listView.GetType();
                WebPartContextualInfo oViewInfo = (WebPartContextualInfo)t.InvokeMember("Microsoft.SharePoint.WebControls.IWebPartPageComponentProvider.WebPartContextualInfo", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.GetProperty, null, listView, new object[] { });

                return oViewInfo;
            }
        }
        protected override void OnPreRender(EventArgs e)
        {

            SPRibbon ribbon = SPRibbon.GetCurrent(this.Page);
            // Ensure ribbon exists.
            if (ribbon != null)
            {
                // Load dependencies if not already on the page.
                ScriptLink.RegisterScriptAfterUI(this.Page, "SP.Ribbon.js", false, true);
            }
            base.OnPreRender(e);
       }
}
于 2013-07-03T15:15:56.010 に答える
0

100 ミリ秒のタイムアウトまたは jquery の代わりに、SharePoint のスクリプト オン デマンドを使用するバージョンの下。リボンが初期化された後に正確に実行されるので、それはより堅実だと思います。

SP.SOD.executeOrDelayUntilScriptLoaded(function () {
    //using setTimeout to ensure it will be executed after the code of sp.ribbon.js has done its initialization
    setTimeout(function () {
        //try to focus the default webpart so the ribbon will show
        var elem = document.getElementById("MSOZoneCell_WebPartWPQ2");
        if (elem != null) {
            var dummyevent = new Array();
            dummyevent["target"] = elem;
            dummyevent["srcElement"] = elem;
            WpClick(dummyevent);
        }
    }, 0);
}, "sp.ribbon.js");
于 2018-01-10T09:51:01.730 に答える