Firemonkey ListView 滚动条可见性
Firemonkey ListView scrollbar visibility
在 Firemonkey 的 TListview
中,滚动条的可见性取决于系统是否有触摸屏。当列表视图上没有足够的空间来显示所有列表项时,如何覆盖此行为并始终显示垂直滚动?
我在 TListViewBase.Create
中看到滚动可见性再次取决于 HasTouchTracking
的函数结果,这取决于 TScrollingBehaviour.TouchTracking
是否在 SystemInformationService.GetScrollingBehaviour
中设置。
有没有人知道如何覆盖此行为?
不久前我"threw together"(匆忙)这个单元重写 Windows 的 GetScrollingBehaviour。您可以为要覆盖它的任何平台做类似的事情。在 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.
对于 Dave 提出的解决方法,需要按如下方式关闭触摸跟踪:
function TPlatformListViewWorkaround.GetScrollingBehaviour: TScrollingBehaviours;
begin
result := fSysInfoService.GetScrollingBehaviour - [TScrollingBehaviour.TouchTracking];
end;
但是,使用此解决方案,您必须接受无法再用手指滚动触摸屏系统上的列表视图。
这就是为什么我现在在 Embarcadero Quality Central 中提出了一个变更请求,并通过使用新的 属性 SuppressScrollBarOnTouchSystems (RSP-26584) 扩展 TListView 来提出解决方案建议。
在 Firemonkey 的 TListview
中,滚动条的可见性取决于系统是否有触摸屏。当列表视图上没有足够的空间来显示所有列表项时,如何覆盖此行为并始终显示垂直滚动?
我在 TListViewBase.Create
中看到滚动可见性再次取决于 HasTouchTracking
的函数结果,这取决于 TScrollingBehaviour.TouchTracking
是否在 SystemInformationService.GetScrollingBehaviour
中设置。
有没有人知道如何覆盖此行为?
不久前我"threw together"(匆忙)这个单元重写 Windows 的 GetScrollingBehaviour。您可以为要覆盖它的任何平台做类似的事情。在 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.
对于 Dave 提出的解决方法,需要按如下方式关闭触摸跟踪:
function TPlatformListViewWorkaround.GetScrollingBehaviour: TScrollingBehaviours;
begin
result := fSysInfoService.GetScrollingBehaviour - [TScrollingBehaviour.TouchTracking];
end;
但是,使用此解决方案,您必须接受无法再用手指滚动触摸屏系统上的列表视图。
这就是为什么我现在在 Embarcadero Quality Central 中提出了一个变更请求,并通过使用新的 属性 SuppressScrollBarOnTouchSystems (RSP-26584) 扩展 TListView 来提出解决方案建议。