Видимость полосы прокрутки в Firemonkey ListView - PullRequest
0 голосов
/ 31 октября 2019

В Firemonkey's TListview видимость полосы прокрутки зависит от того, имеет ли система сенсорный экран. Как я могу переопределить это поведение и показывать вертикальную прокрутку всегда, когда в представлении списка недостаточно места для отображения всех элементов списка?

Я видел в TListViewBase.Create, что видимость прокрутки снова зависит от результата функцииHasTouchTracking, и это зависит от того, установлено ли TScrollingBehaviour.TouchTracking в SystemInformationService.GetScrollingBehaviour.

Кто-нибудь знает, как я могу изменить это поведение?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Некоторое время назад я «бросил» (в спешке) этот блок, чтобы переопределить GetScrollingBehaviour для Windows. Вы можете сделать что-то подобное для любой платформы, для которой вы хотите переопределить. В методе Create я удаляю установленную службу, но сохраняю ссылку на нее для частей, которые не переопределяются, а затем заменяю ее своей собственной.

unit DW.ScrollingBehaviourPatch.Win;

// This unit is used for testing of "inertial" scrolling of listviews etc on devices that do not have touch capability

interface

implementation

uses
  FMX.Platform;

type
  TPlatform = class(TInterfacedObject, IFMXSystemInformationService)
  private
    class var FPlatform: TPlatform;
  private
    FSysInfoService: IFMXSystemInformationService;
  public
    { IFMXSystemInformationService }
    function GetScrollingBehaviour: TScrollingBehaviours;
    function GetMinScrollThumbSize: Single;
    function GetCaretWidth: Integer;
    function GetMenuShowDelay: Integer;
  public
    constructor Create;
    destructor Destroy; override;
  end;

{ TPlatform }

constructor TPlatform.Create;
begin
  inherited;
  if TPlatformServices.Current.SupportsPlatformService(IFMXSystemInformationService, FSysInfoService) then
    TPlatformServices.Current.RemovePlatformService(IFMXSystemInformationService);
  TPlatformServices.Current.AddPlatformService(IFMXSystemInformationService, Self);
  FPlatform := Self;
end;

destructor TPlatform.Destroy;
begin
  //
  inherited;
end;

function TPlatform.GetCaretWidth: Integer;
begin
  Result := FSysInfoService.GetCaretWidth;
end;

function TPlatform.GetMenuShowDelay: Integer;
begin
  Result := FSysInfoService.GetMenuShowDelay;
end;

function TPlatform.GetMinScrollThumbSize: Single;
begin
  Result := FSysInfoService.GetMinScrollThumbSize;
end;

function TPlatform.GetScrollingBehaviour: TScrollingBehaviours;
begin
  Result := [TScrollingBehaviour.Animation, TScrollingBehaviour.TouchTracking];
end;

initialization
  TPlatform.Create;

end.
0 голосов
/ 06 ноября 2019

Для предложенного Дейвом обходного пути сенсорное отслеживание необходимо отключить следующим образом:

function TPlatformListViewWorkaround.GetScrollingBehaviour: TScrollingBehaviours;
begin
  result := fSysInfoService.GetScrollingBehaviour - [TScrollingBehaviour.TouchTracking];
end;

Однако с этим решением вы должны признать, что просмотр списка в системах с сенсорным экраном больше нельзя прокручивать с помощьюпалец.

Вот почему я открыл запрос на изменение в Embarcadero Quality Central и предложил предложение решения, расширив TListView новым свойством SuppressScrollBarOnTouchSystems (RSP-26584).

...