1

SharePoint 開発は初めてで、Sharepoint リボンの動作を変更しようとしています。ご存知のように、リボンは他の何か (リスト アイテムなど) がフォーカスされると、自動的に適切なタブまたはタブ グループ (リスト ツール タブ グループなど) に切り替わります。

この絶え間ないタブの切り替えを無効にして、ユーザーが別のタブを明示的にクリックしない限り、ブラウズ タブを常にアクティブなタブにしたいと思います。

Usercontrol の Page_Load() で次のことを試みましたが、ページが最初に読み込まれたときに一度だけ機能します。私は何を間違っていますか?さらに重要なことは、どうすればそれを正しく行うことができるでしょうか?

基本的に、コンテキストが変更されてリボンが切り替わったときに発生するイベントと、このイベントに接続してリボンをブラウズ タブに強制的に戻す方法を誰かが教えてくれることを願っています。

protected void Page_Load()
        {
            string showBrowseTabScript = string.Empty;
            showBrowseTabScript = @"
                                function ShowBrowseTab() {

                                         var ribbon = SP.Ribbon.PageManager.get_instance().get_ribbon();
                                         SelectRibbonTab(""Ribbon.Read"", true);
                                      }

                                      SP.SOD.executeOrDelayUntilScriptLoaded(function() {

                                         var pm = SP.Ribbon.PageManager.get_instance();
                                         pm.add_ribbonInited(function() {

                                            ShowBrowseTab();
                                         });

                                         var ribbon = null;
                                         try
                                         {
                                            ribbon = pm.get_ribbon();

                                         }

                                         catch (e) { }

                                         if (!ribbon) {

                                            if (typeof(_ribbonStartInit) == ""function"")

                                               _ribbonStartInit(_ribbon.initialTabId, false, null);
                                         }
                                         else {

                                            ShowBrowseTab();
                                         }

                                      },

                                      ""sp.ribbon.js"");
                                ";
            this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "BrowseTabScript", showBrowseTabScript, true);
        }
4

2 に答える 2

1

誰かが興味を持っている場合に備えて、これが問題に対する私の解決策です。

ケン・ヘンダーソンの提案を考慮に入れて、SP.Ribbon.jsファイルとSP.Ribbon.debug.jsファイルのコードを変更することでこれを達成しましたが、私はこれまでやろうとしていたことを達成することができました。SP.Ribbon.jsほど不可解ではないため、SP.Ribbon.debug.jsを使用して以下のソリューションを示しています。

基本的に、私は以下のコードを使用して、リボンをだまして、ユーザーが別のタブにいて、[参照]タブをクリックしたと思い込ませます。コードに古いタブ情報を設定したことに気付くでしょう。私がこれをしなくても動作しますが、リボンが私が知らない何かのためにその情報を必要とする場合に備えて、私はそれを行いました。このコードは、最初の投稿で投稿したPage_Load()関数と組み合わせて、リボンを必要な動作にさせます。

SP.Ribbon.PageManager.prototype = {

    executeRootCommand: function (commandId, properties, commandInfo, root) {
        ULSMg8: ;
        var $v_0;
        if (!SP.ScriptUtility.isNullOrUndefined(commandInfo) && commandId !== 'RibbonEvent' && (commandId !== 'CommandContextChanged' || (!SP.ScriptUtility.isNullOrUndefined(properties) && properties['ChangedByUser']))) {
// My changes to SP.Ribbon

if (properties["ChangedByUser"] === false) {
            properties["ChangedByUser"] = true;
            var $NewContextId = properties["NewContextId"];
            var $NewContextCommand = properties["NewContextCommand"];
            properties["OldContextId"] = $NewContextId;
            properties["OldContextCommand"] = $NewContextCommand;
            properties["NewContextId"] = "Ribbon.Read";
            properties["NewContextCommand"] = "ReadTab";
            SelectRibbonTab("Ribbon.Read", true);
        }

// End of changes to SP.Ribbon

            // the rest of the code has been ommitted for clarity
        return $v_0;
    }
}
于 2012-04-18T12:47:33.010 に答える
0

私の知る限り、SharePoint は、リボン タブが更新されたとき (タブの追加/削除、またはアクティブなタブ) を検出するイベントを公開していません。少なくとも、タブがいつ追加/削除されたかを検出しようとしていたとき、数週間前に見つけることができませんでした(タブの数/幅だけでどれがアクティブかは気にしませんでした)。

(詳しくなくてすみません、現在オフィスのSharePoint開発環境が使えないので簡単には調べられません。)

この問題を解決するには 2 つの可能性があります (それぞれにリスク/問題があります)。

JS 機能をオーバーライドする

リボンを更新するアイテムをユーザーがクリックしたときに呼び出される JavaScript 関数を特定します。その関数を、必要な動作を提供する独自の関数に置き換えることができる場合があります。これは、ウィンドウ上でスクロールし、幅のサイズ変更の動作を変更する必要があるカスタム マスター ページと概念が似ています。詳細は今のところ確認できていませんが、core.jsではSingleItemSelectという関数が呼ばれているようです。

この動作をオーバーライドするタイミングに例外があり、MS が将来何かを変更した場合、実装が壊れたり、更新が必要になったりする可能性がある場合、これは問題になる可能性があります。

独自のイベント ハンドラーを追加する

JavaScript コードで、リボンにイベント ハンドラーをアタッチする適切な DOM イベントを見つけて、MS のコードがいつリボンを変更したかを検出します。DOM イベントの制限により、ハンドラーをアタッチするイベントが存在しない可能性が高くなります。リボン タブの変更を検出してアクティブなタブをリセットする、定期的に呼び出される関数 (ポーリング ループ/タイマー) を追加することになる場合があります。

正直なところ、MS のリボン コードがアクティブなタブを変更し、あなたのリボン コードが元に戻すときにちらつきが発生するため、これはうまく機能しません。さらに、変更を元に戻さないように、ユーザーがタブをクリックしたことを検出する必要があります。

要約

正直なところ、リボンの動作が MS が設計したとおりに機能し、それと戦おうとしないように、この要件を変更してもらいたいと思います。ユーザーがアイテムをクリックしたときに表示されるリボンが本当に問題である場合は、タブを強制的にアクティブにする代わりに、リボンを許可する場所のどこかにリボン領域に追加のリンクを追加することをクライアントに提案しますBrowse(または少なくともMS の JavaScript がリボンに対して行っていることとは関係なく、非表示/表示を切り替えることができます。

于 2012-04-17T13:17:30.750 に答える