@@ -12,7 +12,7 @@ namespace BootstrapBlazor.Components;
1212/// <para lang="zh">动态元素组件</para>
1313/// <para lang="en">Dynamic element component</para>
1414/// </summary>
15- public class DynamicElement : BootstrapComponentBase , IAsyncDisposable
15+ public class DynamicElement : BootstrapComponentBase
1616{
1717 /// <summary>
1818 /// <para lang="zh">获得/设置 TagName 属性 默认为 div</para>
@@ -78,6 +78,34 @@ public class DynamicElement : BootstrapComponentBase, IAsyncDisposable
7878 [ Parameter ]
7979 public bool TriggerContextMenu { get ; set ; }
8080
81+ /// <summary>
82+ /// <para lang="zh">获得/设置 OnTouchStart 回调委托</para>
83+ /// <para lang="en">Gets or sets the OnTouchStart callback delegate</para>
84+ /// </summary>
85+ [ Parameter ]
86+ public Func < TouchEventArgs , Task > ? OnTouchStart { get ; set ; }
87+
88+ /// <summary>
89+ /// <para lang="zh">获得/设置 OnTouchEnd 回调委托</para>
90+ /// <para lang="en">Gets or sets the OnTouchEnd callback delegate</para>
91+ /// </summary>
92+ [ Parameter ]
93+ public Func < TouchEventArgs , Task > ? OnTouchEnd { get ; set ; }
94+
95+ /// <summary>
96+ /// <para lang="zh">获得/设置 是否触发 OnTouchStart 事件 默认 false</para>
97+ /// <para lang="en">Gets or sets whether to trigger OnTouchStart events. Default is false</para>
98+ /// </summary>
99+ [ Parameter ]
100+ public bool TriggerTouchStart { get ; set ; }
101+
102+ /// <summary>
103+ /// <para lang="zh">获得/设置 是否触发 OnTouchEnd 事件 默认 false</para>
104+ /// <para lang="en">Gets or sets whether to trigger OnTouchEnd events. Default is false</para>
105+ /// </summary>
106+ [ Parameter ]
107+ public bool TriggerTouchEnd { get ; set ; }
108+
81109 /// <summary>
82110 /// <para lang="zh">获得/设置 内容组件</para>
83111 /// <para lang="en">Gets or sets the child content</para>
@@ -139,6 +167,16 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
139167 builder . AddEventPreventDefaultAttribute ( 9 , "oncontextmenu" , true ) ;
140168 }
141169
170+ if ( IsTriggerTouchStart ( ) )
171+ {
172+ builder . AddAttribute ( 11 , "ontouchstart" , EventCallback . Factory . Create < TouchEventArgs > ( this , OnTriggerTouchStart ) ) ;
173+ }
174+
175+ if ( IsTriggerTouchEnd ( ) )
176+ {
177+ builder . AddAttribute ( 12 , "ontouchend" , EventCallback . Factory . Create < TouchEventArgs > ( this , OnTriggerTouchEnd ) ) ;
178+ }
179+
142180 builder . AddContent ( 10 , ChildContent ) ;
143181
144182 if ( GenerateElement || IsTriggerClick ( ) || IsTriggerDoubleClick ( ) )
@@ -153,6 +191,10 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
153191
154192 private bool IsTriggerContextMenu ( ) => TriggerContextMenu && OnContextMenu != null ;
155193
194+ private bool IsTriggerTouchStart ( ) => TriggerTouchStart && OnTouchStart != null ;
195+
196+ private bool IsTriggerTouchEnd ( ) => TriggerTouchEnd && OnTouchEnd != null ;
197+
156198 private async Task OnTriggerClick ( )
157199 {
158200 if ( OnClick != null )
@@ -177,28 +219,19 @@ private async Task OnTriggerContextMenu(MouseEventArgs e)
177219 }
178220 }
179221
180- /// <summary>
181- /// <para lang="zh">异步释放资源</para>
182- /// <para lang="en">Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources asynchronously</para>
183- /// </summary>
184- /// <param name="disposing"></param>
185- protected virtual async ValueTask DisposeAsync ( bool disposing )
222+ private async Task OnTriggerTouchStart ( TouchEventArgs e )
186223 {
187- if ( disposing )
224+ if ( OnTouchStart != null )
188225 {
189- OnClick = null ;
190- OnDoubleClick = null ;
191- OnContextMenu = null ;
192- ChildContent = null ;
226+ await OnTouchStart ( e ) ;
193227 }
194228 }
195229
196- /// <summary>
197- /// <inheritdoc/>
198- /// </summary>
199- public async ValueTask DisposeAsync ( )
230+ private async Task OnTriggerTouchEnd ( TouchEventArgs e )
200231 {
201- await DisposeAsync ( true ) ;
202- GC . SuppressFinalize ( this ) ;
232+ if ( OnTouchEnd != null )
233+ {
234+ await OnTouchEnd ( e ) ;
235+ }
203236 }
204237}
0 commit comments