Где находится свойство «EnablePinning» в последних элементах ленточной структуры?

Разметка ленточной инфраструктуры Windows поддерживает атрибут EnablePinning для меню последних элементов в меню приложения:

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

Я ожидал, что будет соответствующее свойство, которое можно запросить/обновить во время выполнения, но я не могу найти ключ свойства. Кто-нибудь знает, есть ли он, и если да, то какой?

В качестве альтернативы, есть ли другой способ включить/выключить закрепление во время выполнения? Ни элемент, ни его родитель не поддерживают режимы приложения.

ТИА

Уточнение: я пытаюсь включить/отключить закрепление для всего меню во время выполнения. Я не беспокоюсь о состояниях контактов отдельных элементов.


person chrisd    schedule 09.06.2015    source источник


Ответы (3)


Я не уверен, что вы можете изменить закрепленное состояние из существующих записей, но определенно возможно программно запрашивать состояние и добавлять новые элементы с определенным состоянием, используя свойство UI_PKEY_Pinned: https://msdn.microsoft.com/en-us/library/windows/desktop/dd940401(v=vs.85).aspx

Оболочки, такие как Windows Ribbon Framework для Delphi или Windows Ribbon для WinForms (.NET), обеспечивают простой доступ к модели API. Эта статья CodeProject также описывает, как запрашивать/ добавить последние элементы с помощью C#.

Если вы хотите изменить состояние во время выполнения, вы можете, например, запросить состояние всех элементов, удалить их из списка, настроить все, что вам нужно, и снова добавить их в список. Пока не делал, может стоит попробовать.

person Daniel Lemke    schedule 10.06.2015
comment
Извините, я думаю, мой вопрос был недостаточно ясен. Что мне нужно сделать, так это включить/отключить закрепление для всего меню. Эквивалент переключения с «EnablePinning=true» на «EnablePinning=false» (или наоборот) в разметке, но во время выполнения. Я не беспокоюсь о состояниях контактов отдельных элементов. Я пытаюсь включить или отключить возможность пользователя закреплять элементы. - person chrisd; 10.06.2015

Хм... это будет довольно сложно сделать, так как флаг определен в XML, который будет скомпилирован в файл ресурсов, связанный с приложением, а затем загружен при запуске. Вы можете создать другое определение ресурса и перезагрузить ленту, если хотите отключить/включить пометку, но это довольно много накладных расходов и, безусловно, заметно с точки зрения пользователей, поскольку требует создания нового дескриптора окна.

person Daniel Lemke    schedule 10.06.2015
comment
Я надеялся, что есть свойство, доступное во время выполнения, как и для многих других атрибутов команды. Но, похоже, его нет. Спасибо. - person chrisd; 02.07.2015

Я размещаю последние элементы внутри 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;

... но я не нашел документации этого решения.

person Tahtu    schedule 11.09.2017