From 19981b2e9c46785d6059681874de56b52ff6ea1c Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 26 Jan 2026 14:05:44 +0800 Subject: [PATCH 1/5] feat(TreeView): add IsAutoScrollIntoView parameter --- src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs b/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs index fc53cea7ac3..711b7c38c6e 100644 --- a/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs +++ b/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs @@ -245,6 +245,13 @@ public partial class TreeView : IModelEqualityComparer [Parameter] public bool EnableKeyboard { get; set; } + /// + /// 获得/设置 是否将 active 选中节点自动滚动到可视状态 + /// Gets or sets whether to automatically scroll the active selected node into the visible state. + /// + [Parameter] + public bool IsAutoScrollIntoView { get; set; } + /// /// 获得/设置 键盘导航时的滚动至视图选项,默认为 null,使用 { behavior: "smooth", block: "nearest", inline: "start" } /// Gets or sets the scroll into view options for keyboard navigation. Default is null, using { behavior: "smooth", block: "nearest", inline: "start" } From 7f630ad0db61747dc31519d2ddab4de796dca5a0 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 26 Jan 2026 14:06:13 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20=5FscrollIntoV?= =?UTF-8?q?iew=20=E6=8E=A7=E5=88=B6=E5=86=85=E9=83=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/TreeView/TreeView.razor.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs b/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs index 711b7c38c6e..2b13f09d4f4 100644 --- a/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs +++ b/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs @@ -357,6 +357,7 @@ public partial class TreeView : IModelEqualityComparer private string? _searchText; private bool _shouldRender = true; private bool _init; + private bool _scrollIntoView = false; /// /// @@ -417,6 +418,7 @@ protected override async Task OnParametersSetAsync() _activeItem ??= Items.FirstOrDefaultActiveItem(); _activeItem?.SetParentExpand, TItem>(true); _init = true; + _scrollIntoView = true; } } } @@ -431,6 +433,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) if (_keyboardArrowUpDownTrigger) { + _scrollIntoView = false; _keyboardArrowUpDownTrigger = false; await InvokeVoidAsync("scroll", Id, ScrollIntoViewOptions); } @@ -439,6 +442,12 @@ protected override async Task OnAfterRenderAsync(bool firstRender) { await InvokeVoidAsync("resetTreeViewRow", Id); } + + if (IsAutoScrollIntoView && _scrollIntoView) + { + _scrollIntoView = false; + await InvokeVoidAsync("scroll", Id, ScrollIntoViewOptions); + } } /// @@ -710,6 +719,7 @@ public void SetActiveItem(TreeViewItem? item) { _activeItem = item; _activeItem?.SetParentExpand, TItem>(true); + _scrollIntoView = true; StateHasChanged(); } From 9c0fca7547e15fee090538ed4eaa631d191f058d Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 26 Jan 2026 14:06:23 +0800 Subject: [PATCH 3/5] chore: bump version 10.2.4-beta01 --- src/BootstrapBlazor/BootstrapBlazor.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 127de31f7ef..aa82b7cd133 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@  - 10.2.3 + 10.2.4-beta01 From c587a06900036c3b2da26f02f9b632ac3c3217a8 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 26 Jan 2026 15:11:18 +0800 Subject: [PATCH 4/5] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/TreeViewTest.cs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/UnitTest/Components/TreeViewTest.cs b/test/UnitTest/Components/TreeViewTest.cs index 9aff84ebb02..3105d0f2da4 100644 --- a/test/UnitTest/Components/TreeViewTest.cs +++ b/test/UnitTest/Components/TreeViewTest.cs @@ -1269,6 +1269,29 @@ public async Task AllowDrag_Ok() Assert.False(treeDragContext.IsChildren); } + [Fact] + public async Task IsAutoScrollIntoView_Ok() + { + ScrollIntoViewOptions? options = null; + Context.JSInterop.SetupVoid("scroll", invocationMatcher => + { + options = invocationMatcher.Arguments[1] as ScrollIntoViewOptions; + return true; + }); + var cut = Context.Render>(pb => + { + pb.Add(a => a.Items, TreeFoo.GetTreeItems()); + pb.Add(a => a.IsAutoScrollIntoView, true); + pb.Add(a => a.ScrollIntoViewOptions, new ScrollIntoViewOptions() + { + Behavior = ScrollIntoViewBehavior.Smooth, + Inline = ScrollIntoViewInline.Center, + Block = ScrollIntoViewBlock.Center + }); + }); + Assert.NotNull(options); + } + class MockTree : TreeView where TItem : class { public bool TestComparerItem(TItem? a, TItem? b) => base.Equals(a, b); From 7849e4878afc2b96f8928e4b8745dc3887452690 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 26 Jan 2026 15:18:51 +0800 Subject: [PATCH 5/5] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/TreeViewTest.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/test/UnitTest/Components/TreeViewTest.cs b/test/UnitTest/Components/TreeViewTest.cs index 3105d0f2da4..a7be5b16cb7 100644 --- a/test/UnitTest/Components/TreeViewTest.cs +++ b/test/UnitTest/Components/TreeViewTest.cs @@ -1272,16 +1272,22 @@ public async Task AllowDrag_Ok() [Fact] public async Task IsAutoScrollIntoView_Ok() { + var items = TreeFoo.GetTreeItems(); ScrollIntoViewOptions? options = null; Context.JSInterop.SetupVoid("scroll", invocationMatcher => { options = invocationMatcher.Arguments[1] as ScrollIntoViewOptions; return true; - }); + }).SetVoidResult(); var cut = Context.Render>(pb => { - pb.Add(a => a.Items, TreeFoo.GetTreeItems()); + pb.Add(a => a.Items, items); pb.Add(a => a.IsAutoScrollIntoView, true); + }); + Assert.Null(options); + + cut.Render(pb => + { pb.Add(a => a.ScrollIntoViewOptions, new ScrollIntoViewOptions() { Behavior = ScrollIntoViewBehavior.Smooth, @@ -1289,6 +1295,7 @@ public async Task IsAutoScrollIntoView_Ok() Block = ScrollIntoViewBlock.Center }); }); + await cut.InvokeAsync(() => cut.Instance.SetActiveItem(items.First())); Assert.NotNull(options); }