快速存取工具列
快速存取工具列 (QAT) 是一個小型的可自定義工具列,會公開應用程式所指定的一組命令,或由使用者選取。
簡介
根據預設,快速存取工具列 (QAT) 位於應用程式視窗的標題欄中,但可以設定為在功能區下方顯示。 除了公開命令之外,快速存取工具列 (QAT) 也包含可自定義的下拉功能表,其中包含一組完整的預設快速存取工具列 (QAT) 命令 (無論隱藏或顯示在快速存取工具列 (QAT) 和一組快速存取工具列 (QAT) 和功能區選項。
下列螢幕快照顯示功能區快速存取工具列 (QAT) 的範例。
快速存取工具列 (QAT) 包含由應用程式指定最多 20 個命令的組合(稱為應用程式預設清單),或由使用者選取。 快速存取工具列 (QAT) 可以包含功能區 UI 中其他地方無法使用的唯一命令。
注意
雖然幾乎所有功能區控件都允許透過下列螢幕快照所示的內容功能表,將其相關聯的命令新增至快速存取工具列(QAT),但在內容快顯中公開的命令不提供此操作功能表。
實作快速存取工具列
如同所有 Windows 功能區架構控制項,充分利用快速存取工具列 (QAT) 需要標記元件,以控制功能區內的簡報,以及控管其功能的程式代碼元件。
標記
快速存取工具列 (QAT) 控制項會透過 QuickAccessToolbar 元素宣告及與命令標識符相關聯。 命令標識碼可用來識別並系結快速存取工具列 (QAT) 至應用程式所定義的命令處理程式。
除了主要快速存取工具列 (QAT) 功能的基本命令處理程式之外,宣告選擇性 的 CustomizeCommandName QuickAccessToolbar 元素屬性,會使架構將 [更多命令] 專案新增 至需要定義次要命令處理程式的 [快速存取工具欄] 下拉功能表的 [命令 ] 清單。
為了在功能區應用程式之間保持一致性,建議 CustomizeCommandName 命令處理程式啟動快速存取工具列 (QAT) 自定義對話方塊。 因為功能區架構只會在UI中提供啟動點,因此應用程式只會負責在收到此命令的回呼通知時提供自定義對話框實作。
下列螢幕快照顯示 [快速存取工具列][QAT] 下拉功能表,其中包含 [ 更多命令] 命令專案。
快速存取工具列 (QAT) 的應用程式預設清單是透過 QuickAccessToolbar.ApplicationDefaults 屬性來指定,該屬性會識別建議命令的預設清單,這些命令全都列在 [快速存取工具列] 下拉功能表中。
若要在快速存取工具列 (QAT) 工具列中顯示應用程式預設清單的命令, 每個控件專案的 ApplicationDefaults.IsChecked 屬性必須具有 值 true
。 上述影像顯示將此屬性 true
設定為 [ 儲存]、 [復原] 和 [重做 命令] 的結果。
QuickAccessToolbar.ApplicationDefaults 支援三種類型的功能區控件: 按鈕、 切換按鈕和 複選框。
注意
Windows 8 和更新版本:支援所有資源庫型控件(ComboBox、InRibbonGallery、SplitButtonGallery 和 DropDownGallery)。
資源庫控件中的專案可以支援在暫留時反白顯示。 若要支援暫留醒目提示,資源庫必須是專案庫,並使用 VerticalMenuLayout 類型的 FlowMenuLayout。
下列範例示範 QuickAccessToolbar 元素的基本標記。
此程式代碼區段會顯示快速存取工具列 (QAT) 專案的命令宣告。
<Command Name="cmdQAT"
Symbol="ID_QAT"
Id="40000"/>
<Command Name="cmdCustomizeQAT"
Symbol="ID_CUSTOM_QAT"
Id="40001"/>
此區段的程式代碼會顯示快速存取工具列 (QAT) 專案的控件宣告。
<Ribbon.QuickAccessToolbar>
<QuickAccessToolbar CommandName="cmdQAT"
CustomizeCommandName="cmdCustomizeQAT">
<QuickAccessToolbar.ApplicationDefaults>
<Button CommandName="cmdButton1"/>
<ToggleButton CommandName="cmdMinimize"
ApplicationDefaults.IsChecked="false"/>
</QuickAccessToolbar.ApplicationDefaults>
</QuickAccessToolbar>
</Ribbon.QuickAccessToolbar>
代碼
功能區架構應用程式必須提供命令處理程式回呼方法,才能操作快速存取工具列 (QAT)。 此處理程式的運作方式與命令庫處理程式類似,不同之處在於快速存取工具列 (QAT) 不支援類別。 如需詳細資訊,請參閱 使用資源庫。
快速存取工具列 (QAT) 命令集合會透過UI_PKEY_ItemsSource屬性索引鍵擷取為 IUICollection 物件。 將命令新增至運行時間的快速存取工具列 (QAT),是藉由將 IUISimplePropertySet 物件新增至 IUICollection 來完成。
不同於命令資源庫,快速存取工具列 (QAT) IUISimplePropertySet 物件不需要命令類型屬性 (UI_PKEY_CommandType)。 不過,命令必須存在於功能區或快速存取工具列 (QAT) 應用程式預設值清單中;無法在運行時間建立新的命令,並新增至快速存取工具列 (QAT)。
注意
功能區應用程式無法以衍生自 IEnumUnknown 的自定義集合物件取代快速存取工具列 (QAT) IUICollection 。
下列範例示範基本的快速存取工具列 (QAT) 命令處理程式實作。
/* QAT COMMAND HANDLER IMPLEMENTATION */
class CQATCommandHandler
: public CComObjectRootEx<CComMultiThreadModel>
, public IUICommandHandler
{
public:
BEGIN_COM_MAP(CQATCommandHandler)
COM_INTERFACE_ENTRY(IUICommandHandler)
END_COM_MAP()
// QAT command handler's Execute method
STDMETHODIMP Execute(UINT nCmdID,
UI_EXECUTIONVERB verb,
const PROPERTYKEY* key,
const PROPVARIANT* ppropvarValue,
IUISimplePropertySet* pCommandExecutionProperties)
{
UNREFERENCED_PARAMETER(nCmdID);
UNREFERENCED_PARAMETER(verb);
UNREFERENCED_PARAMETER(ppropvarValue);
UNREFERENCED_PARAMETER(pCommandExecutionProperties);
// Do not expect Execute callback for a QAT command
return E_NOTIMPL;
}
// QAT command handler's UpdateProperty method
STDMETHODIMP UpdateProperty(UINT nCmdID,
REFPROPERTYKEY key,
const PROPVARIANT* ppropvarCurrentValue,
PROPVARIANT* ppropvarNewValue)
{
UNREFERENCED_PARAMETER(nCmdID);
UNREFERENCED_PARAMETER(ppropvarNewValue);
HRESULT hr = E_NOTIMPL;
if (key == UI_PKEY_ItemsSource)
{
ATLASSERT(ppropvarCurrentValue->vt == VT_UNKNOWN);
CComQIPtr<IUICollection> spCollection(ppropvarCurrentValue->punkVal);
UINT nCount;
if (SUCCEEDED(hr = spCollection->GetCount(&nCount)))
{
if (nCount == 0)
{
// If the current Qat list is empty, then we will add a few items here.
UINT commands[] = { cmdSave, cmdUndo};
int count = _countof(commands);
for (int i = 0; i < count; i++)
{
PROPERTYKEY keys[1] = {UI_PKEY_CommandId};
CComObject<CItemProperties> *pItem = NULL;
if (SUCCEEDED(CComObject<CItemProperties>::CreateInstance(&pItem)))
{
PROPVARIANT vars[1];
InitPropVariantFromUInt32(commands[i], &vars[0]);
pItem->Initialize(NULL, _countof(vars), keys, vars);
CComPtr<IUnknown> spUnknown;
pItem->QueryInterface(&spUnknown);
spCollection->Add(spUnknown);
FreePropVariantArray(_countof(vars), vars);
}
}
}
else
{
// Do nothing if the Qat list is not empty.
// Return S_FALSE to indicate the callback succeeded.
return S_FALSE;
}
}
}
return hr;
}
};
QAT 持續性
快速存取工具列 (QAT) 命令專案和設定可以使用 IUIRibbon::SaveSettingsToStream 和 IUIRibbon::LoadSettingsFromStream 函式,跨應用程式會話保存。 如需詳細資訊,請參閱 保存功能區狀態。
快速存取工具列屬性
功能區架構會定義快速存取工具列 (QAT) 控制件的屬性索引鍵集合。
一般而言,快速存取工具列 (QAT) 屬性會在功能區 UI 中更新,方法是透過呼叫 IUIFramework::InvalidateUICommand 方法,使與控件相關聯的命令失效。 無效事件會處理,而 IUICommandHandler::UpdateProperty 回呼方法所定義的屬性更新。
IUICommandHandler::UpdateProperty 回呼方法不會執行,而且應用程式會查詢更新的屬性值,直到架構需要屬性為止。 例如,當索引標籤啟動時,以及在功能區 UI 中顯示控件,或顯示工具提示時。
注意
在某些情況下,可以透過 IUIFramework::GetUICommandProperty 方法擷取屬性,並使用 IUIFramework::SetUICommandProperty 方法進行設定。
下表列出與快速存取工具列 (QAT) 控件相關聯的屬性索引鍵。
屬性索引鍵 | 備註 |
---|---|
UI_PKEY_ItemsSource | 支援 IUIFramework::GetUICommandProperty (不支援 IUIFramework::SetUICommandProperty)。IUIFramework::GetUICommandProperty 會傳回代表 QAT 中命令的 IUICollection 物件的指標。 每個命令都是透過其命令標識符來識別,其方式是呼叫 IUISimplePropertySet::GetValue 方法,並傳入屬性索引鍵 UI_PKEY_CommandId。 |
快速存取工具列 (QAT) 下拉功能表的 [更多命令] 命令項目沒有相關聯的屬性索引鍵