0

的Windows功能區框架標記支持最近的項目菜單中的應用程序菜單的EnablePinning屬性:功能區框架的最近項目中的「EnablePinning」屬性在哪裏?

<ApplicationMenu.RecentItems> 
    <RecentItems CommandName="MRU" EnablePinning="true" /> 
</ApplicationMenu.RecentItems> 

我預計會有可以查詢/在運行時更新匹配的屬性,但我找不到屬性鍵。有人知道是否有一個,如果有的話,它是什麼?

另外,還有另一種方法來在運行時打開/關閉鎖定/關閉?元素及其父級支持應用程序模式。

TIA

澄清:我想要做的就是啓用/禁用寄託在運行時整個菜單。我不關心單個項目的銷狀態。

回答

0

我不知道,如果你可以修改現有條目中的固定狀態,但它絕對有可能以編程方式查詢狀態,並使用UI_PKEY_Pinned屬性與特定的狀態添加新項目: https://msdn.microsoft.com/en-us/library/windows/desktop/dd940401(v=vs.85).aspx

化包裝,如適用於Delphi的Windows功能區框架WinForms的Windows功能區(.NET)可輕鬆訪問API模型。文章還介紹瞭如何使用C#查詢/添加最近的項目。

如果您想要在運行時更改狀態,例如可以查詢所有項目的狀態,將它們從列表中移除,根據需要進行調整並將其添加到列表中。沒有那樣做,但是值得一試。

+0

對不起,我想我的問題還不夠清楚。我需要做的是啓用/禁用整個菜單的固定。相當於在標記中,但在運行時從「EnablePinning = true」切換爲「EnablePinning = false」(反之亦然)。我不關心單個項目的銷狀態。我試圖啓用或禁用用戶的固定項目的能力。 – chrisd

0

嗯......這將是很難完成的,因爲在XML中定義標誌將被編譯到鏈接到應用程序的資源文件中,然後在啓動時加載。如果您想禁用/啓用標記,您可以創建另一個資源定義並重新加載功能區,但是從用戶的角度來看,這是相當多的開銷,並且肯定會引起注意,因爲它需要創建新的窗口句柄。

+0

我希望有一個運行時可訪問的屬性,就像其他許多命令屬性一樣。但似乎沒有一個。謝謝。 – chrisd

0

我把最近的項目由內而外UpdateProperty

TRecentItem = class(TInterfacedObject, IUISimplePropertySet) 
    private 
     FRecentFile: TSSettings.TRecentFile; 
    protected 
     function GetValue(const key: TUIPropertyKey; out value: TPropVariant): HRESULT; stdcall; 
    public 
     procedure Initialize(const RecentFile: TSSettings.TRecentFile); safecall; 
    end; 

function TMyForm.UpdateProperty(commandId: UInt32; const key: TUIPropertyKey; 
    currentValue: PPropVariant; out newValue: TPropVariant): HRESULT; 
var 
    I: Integer; 
    psa: PSafeArray; 
    pv: Pointer; 
    RecentItem: TRecentItem; 
begin 
    if (key = UI_PKEY_RecentItems) then 
    begin 
    psa := SafeArrayCreateVector(VT_UNKNOWN, 0, Settings.RecentFiles.Count); 

    if (not Assigned(psa)) then 
     Result := E_FAIL 
    else 
    begin 
     for I := 0 to Settings.RecentFiles.Count - 1 do 
     begin 
     RecentItem := TRecentItem.NewInstance() as TRecentItem; 
     RecentItem.Initialize(Settings.RecentFiles[I]); 
     pv := Pointer(IUnknown(RecentItem)); 
     Check(SafeArrayPutElement(psa, I, pv^)); 
     end; 

     Result := UIInitPropertyFromIUnknownArray(UI_PKEY_RecentItems, psa, PropVar); 

     SafeArrayDestroy(psa); 
    end; 
    end; 

如果引腳被改變,我得到這個命令而關閉應用程序菜單:

function TMyForm.Execute(commandId: UInt32; verb: _UIExecutionVerb; 
    key: PUIPropertyKey; currentValue: PPropVariant; 
    commandExecutionProperties: IUISimplePropertySet): HRESULT; stdcall; 
var 
    Count: Integer; 
    I: Integer; 
    Pinned: Boolean; 
    psa: PSafeArray; 
    pv: IUnknown; 
    RecentFile: UInt32; 
    SimplePropertySet: IUISimplePropertySet; 
    Value: TPropVariant; 
begin 
    if ((commandId = cmdAppRecentItems) 
    and Assigned(key) and (key^ = UI_PKEY_RecentItems) 
    and Assigned(currentValue) and (currentValue^.vt = VT_ARRAY + VT_UNKNOWN)) then 
    begin 
    psa := nil; 
    Result := UIPropertyToIUnknownArrayAlloc(key^, currentValue^, psa); 
    if (Succeeded(Result)) then 
    begin 
     Result := SafeArrayGetUBound(psa, 1, Count); 
     for I := 0 to Count do 
     if (Succeeded(Result)) then 
     begin 
      Result := SafeArrayGetElement(psa, I, pv); 
      if (Succeeded(Result) and Assigned(pv)) then 
      begin 
      Result := pv.QueryInterface(IUISimplePropertySet, SimplePropertySet); 
      if (Succeeded(Result)) then 
       Result := SimplePropertySet.GetValue(UI_PKEY_Pinned, Value); 
      if (Succeeded(Result)) then 
       Result := UIPropertyToBoolean(UI_PKEY_Pinned, Value, Pinned); 
      if (Succeeded(Result)) then 
       Settings.RecentFiles.SetPinned(I, Pinned); 
      end; 
     end; 
     SafeArrayDestroy(psa); 
    end; 
    end 
end; 

...但我沒有找到這個解決方案的文檔。

相關問題