├── docs ├── public │ ├── main.js │ ├── main.css │ ├── chunk-EDJWACL4.min.js │ ├── bootstrap-icons-BNVXHMH5.woff │ ├── bootstrap-icons-OCU552PF.woff │ ├── bootstrap-icons-UDRIHJCM.woff2 │ ├── bootstrap-icons-X6UQXWUS.woff2 │ ├── chunk-OSRY5VT3.min.js.map │ ├── chunk-P42HNYSU.min.js.map │ ├── chunk-XUHMPXWX.min.js.map │ ├── lunr.ja-6645DQV5.min.js.map │ ├── lunr.ja-J6QHZSR2.min.js.map │ ├── lunr.ja-RG3AQVTE.min.js.map │ ├── info-46DW6VJ7-RDUIJSMX.min.js.map │ ├── packet-W2GHVCYJ-ZZMTAWKW.min.js.map │ ├── pie-BEWT4RHE-VFWRUT6J.min.js.map │ ├── gitGraph-YCYPL57B-3XOJ53I6.min.js.map │ ├── architecture-I3QFYML2-2T2ZUHXO.min.js.map │ ├── lunr.ja-6645DQV5.min.js │ ├── lunr.ja-J6QHZSR2.min.js │ ├── lunr.ja-RG3AQVTE.min.js │ ├── lunr.jp-2KRE2L63.min.js │ ├── lunr.jp-M45D3XJE.min.js │ ├── lunr.jp-P5CLAZPO.min.js │ ├── mermaid.core-SEZKZMNB.min.js │ ├── mermaid.core-TOXYJXQE.min.js │ ├── chunk-I4ZXTPQC.min.js │ ├── chunk-EKP7MBOP.min.js │ ├── chunk-EDJWACL4.min.js.map │ ├── chunk-5IIW54K6.min.js │ ├── pie-BEWT4RHE-VFWRUT6J.min.js │ ├── info-46DW6VJ7-RDUIJSMX.min.js │ ├── chunk-V55NTXQN.min.js │ ├── packet-W2GHVCYJ-ZZMTAWKW.min.js │ ├── gitGraph-YCYPL57B-3XOJ53I6.min.js │ ├── architecture-I3QFYML2-2T2ZUHXO.min.js │ ├── chunk-33FU46FA.min.js │ ├── chunk-OZ2RCKQJ.min.js │ ├── chunk-UEFJDIUO.min.js │ ├── lunr.jp-2KRE2L63.min.js.map │ ├── lunr.jp-M45D3XJE.min.js.map │ ├── lunr.jp-P5CLAZPO.min.js.map │ ├── mermaid.core-SEZKZMNB.min.js.map │ ├── mermaid.core-TOXYJXQE.min.js.map │ ├── chunk-PDS7545E.min.js │ ├── chunk-OSRY5VT3.min.js │ ├── chunk-ISDTAGDN.min.js │ ├── flowDiagram-v2-2f8f667a-WVVXSXHH.min.js │ ├── classDiagram-LNE6IOMH-VZ67B4ZP.min.js │ ├── stateDiagram-v2-4JROLMXI-COTI64PW.min.js │ ├── classDiagram-v2-MQ7JQ4JX-4JTAVB6L.min.js │ ├── flowDiagram-v2-13329dc7-7HQDDRUE.min.js │ ├── chunk-IJ4BRSPX.min.js │ ├── chunk-I4ZXTPQC.min.js.map │ ├── chunk-EKP7MBOP.min.js.map │ ├── chunk-P42HNYSU.min.js │ ├── chunk-XUHMPXWX.min.js │ ├── infoDiagram-A4XQUW5V-SKLVFWJI.min.js │ ├── chunk-V55NTXQN.min.js.map │ ├── chunk-5IIW54K6.min.js.map │ ├── chunk-JL3VILNY.min.js │ ├── chunk-IQQ46AC6.min.js │ ├── chunk-WXIN66R4.min.js │ ├── chunk-F7JJDB3C.min.js │ ├── chunk-M7PQX5EB.min.js │ ├── classDiagram-LNE6IOMH-VZ67B4ZP.min.js.map │ ├── classDiagram-v2-MQ7JQ4JX-4JTAVB6L.min.js.map │ ├── stateDiagram-v2-4JROLMXI-COTI64PW.min.js.map │ ├── lunr.vi-3U4A337N.min.js │ ├── lunr.vi-QNO46JPR.min.js │ ├── lunr.vi-S3VOAA5A.min.js │ ├── chunk-C7DS3QYJ.min.js │ ├── lunr.th-LSQ6T65I.min.js │ ├── lunr.th-O4JBL3IY.min.js │ ├── lunr.th-RUK2AEUT.min.js │ ├── chunk-CLIYZZ5Y.min.js │ ├── flowDiagram-v2-13329dc7-7HQDDRUE.min.js.map │ ├── flowDiagram-v2-2f8f667a-WVVXSXHH.min.js.map │ ├── chunk-CM5D5KZN.min.js │ ├── chunk-33FU46FA.min.js.map │ ├── infoDiagram-A4XQUW5V-SKLVFWJI.min.js.map │ ├── chunk-OZ2RCKQJ.min.js.map │ ├── chunk-UEFJDIUO.min.js.map │ ├── lunr.hy-E2P7YR63.min.js │ ├── lunr.hy-FFQJAR7M.min.js │ ├── lunr.hy-XFQCAWFO.min.js │ ├── chunk-PDS7545E.min.js.map │ ├── chunk-ISDTAGDN.min.js.map │ ├── chunk-334IV3XH.min.js │ ├── chunk-DTUU2GN4.min.js │ ├── chunk-NRE4YRK7.min.js │ ├── chunk-IJ4BRSPX.min.js.map │ ├── lunr.vi-3U4A337N.min.js.map │ ├── lunr.vi-QNO46JPR.min.js.map │ ├── lunr.vi-S3VOAA5A.min.js.map │ ├── chunk-JL3VILNY.min.js.map │ ├── lunr.te-2RZIMFIT.min.js │ ├── lunr.te-JGGL3BFP.min.js │ ├── lunr.te-OBAK5FVS.min.js │ ├── lunr.ta-AKIPBQLC.min.js │ ├── lunr.ta-KO56CLDU.min.js │ ├── lunr.ta-OWB7AURB.min.js │ └── diagram-QW4FP2JN-UOF7FAFC.min.js ├── favicon.ico ├── docs │ ├── toc.json │ └── toc.html ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 ├── styles │ ├── main.js │ ├── main.css │ └── search-worker.js ├── toc.json ├── toc.html ├── logo.svg └── api │ ├── toc.json │ └── toc.html ├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ ├── config.yml │ └── default-template.md ├── src ├── .gitignore ├── VirtualizingWrapPanel │ ├── docfx │ │ ├── api │ │ │ ├── index.md │ │ │ └── .gitignore │ │ ├── docs │ │ │ └── toc.yml │ │ ├── build.ps1 │ │ ├── toc.yml │ │ ├── custom │ │ │ └── public │ │ │ │ └── main.css │ │ ├── filter.yml │ │ └── docfx.json │ ├── ScrollDirection.cs │ ├── index.md │ ├── IItemSizeProvider.cs │ ├── PolyfillExtensions.cs │ ├── ItemAlignment.cs │ ├── pack.ps1 │ ├── SpacingMode.cs │ ├── Utils.cs │ ├── AssemblyInfo.cs │ ├── nuget │ │ └── README.md │ ├── GridDetailsView.xaml │ ├── VirtualizingWrapPanel.csproj │ ├── VirtualizingItemsControl.cs │ └── ReferenceEqualityComparer.cs ├── VirtualizingWrapPanelSamples │ ├── App.config │ ├── TestItemSizeProvider.cs │ ├── VirtualizingWrapPanelSamples.csproj │ ├── ColorToBrushConverter.cs │ ├── BoolToVisibilityConverter.cs │ ├── App.xaml │ ├── Properties │ │ └── PublishProfiles │ │ │ └── Win-x64.pubxml │ ├── App.xaml.cs │ └── TestItem.cs ├── VirtualizingWrapPanelSamplesFW │ ├── App.config │ ├── Properties │ │ ├── Settings.settings │ │ ├── Settings.Designer.cs │ │ └── Resources.Designer.cs │ ├── App.xaml.cs │ ├── App.xaml │ └── VirtualizingWrapPanelSamplesFW.csproj ├── VirtualizingWrapPanelTest │ ├── TestItemSizeProvider.cs │ ├── Mocks │ │ ├── LazyTestItem.cs │ │ └── TestItem.cs │ ├── VirtualizingWrapPanelTest.csproj │ └── Tests │ │ ├── RegressionTest.cs │ │ ├── GroupingTest_ScrollIntoView_ItemAfterViewportAndCache_DifferentGroupSizes.cs │ │ ├── ResizeTest.cs │ │ ├── CacheTest.cs │ │ └── GroupingTest_ItemsDoNotOverlap.cs ├── VirtualizingWrapPanelPerformanceTest │ ├── VirtualizingWrapPanelPerformanceTest.csproj │ └── BasisPerformanceTest.cs └── VirtualizingWrapPanel.sln ├── SamplesApplication.md ├── LICENSE └── README.md /docs/public/main.js: -------------------------------------------------------------------------------- 1 | export default {} 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: sbaeumlisberger 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /src/.gitignore: -------------------------------------------------------------------------------- 1 | .vs/ 2 | packages/ 3 | obj/ 4 | bin/ 5 | 6 | *.user 7 | -------------------------------------------------------------------------------- /docs/public/main.css: -------------------------------------------------------------------------------- 1 | .typelist.inheritedMembers { 2 | display: none; 3 | } 4 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/docfx/api/index.md: -------------------------------------------------------------------------------- 1 | 2 | # VirtualizingWrapPanel API 3 | 4 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/docfx/docs/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Getting Started 2 | href: getting-started.md -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbaeumlisberger/VirtualizingWrapPanel/HEAD/docs/favicon.ico -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/docfx/build.ps1: -------------------------------------------------------------------------------- 1 | # dotnet tool install -g docfx 2 | 3 | docfx docfx.json --serve -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/docfx/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Documentation 2 | href: docs/ 3 | - name: API 4 | href: api/ -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/docfx/custom/public/main.css: -------------------------------------------------------------------------------- 1 | .typelist.inheritedMembers { 2 | display: none; 3 | } 4 | -------------------------------------------------------------------------------- /docs/public/chunk-EDJWACL4.min.js: -------------------------------------------------------------------------------- 1 | var r="11.4.1";export{r as a}; 2 | //# sourceMappingURL=chunk-EDJWACL4.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/docfx/api/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | ############### 3 | # temp file # 4 | ############### 5 | *.yml 6 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamples/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /docs/docs/toc.json: -------------------------------------------------------------------------------- 1 | 2 | {"items":[{"name":"Getting Started","href":"getting-started.html","topicHref":"getting-started.html"}],"pdf":false} 3 | -------------------------------------------------------------------------------- /docs/public/bootstrap-icons-BNVXHMH5.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbaeumlisberger/VirtualizingWrapPanel/HEAD/docs/public/bootstrap-icons-BNVXHMH5.woff -------------------------------------------------------------------------------- /docs/public/bootstrap-icons-OCU552PF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbaeumlisberger/VirtualizingWrapPanel/HEAD/docs/public/bootstrap-icons-OCU552PF.woff -------------------------------------------------------------------------------- /docs/public/bootstrap-icons-UDRIHJCM.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbaeumlisberger/VirtualizingWrapPanel/HEAD/docs/public/bootstrap-icons-UDRIHJCM.woff2 -------------------------------------------------------------------------------- /docs/public/bootstrap-icons-X6UQXWUS.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbaeumlisberger/VirtualizingWrapPanel/HEAD/docs/public/bootstrap-icons-X6UQXWUS.woff2 -------------------------------------------------------------------------------- /docs/public/chunk-OSRY5VT3.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/chunk-P42HNYSU.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/chunk-XUHMPXWX.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbaeumlisberger/VirtualizingWrapPanel/HEAD/docs/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /docs/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbaeumlisberger/VirtualizingWrapPanel/HEAD/docs/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /docs/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbaeumlisberger/VirtualizingWrapPanel/HEAD/docs/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /docs/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sbaeumlisberger/VirtualizingWrapPanel/HEAD/docs/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /docs/public/lunr.ja-6645DQV5.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/lunr.ja-J6QHZSR2.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/lunr.ja-RG3AQVTE.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/info-46DW6VJ7-RDUIJSMX.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/packet-W2GHVCYJ-ZZMTAWKW.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/pie-BEWT4RHE-VFWRUT6J.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/gitGraph-YCYPL57B-3XOJ53I6.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/styles/main.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information. 2 | -------------------------------------------------------------------------------- /docs/public/architecture-I3QFYML2-2T2ZUHXO.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/lunr.ja-6645DQV5.min.js: -------------------------------------------------------------------------------- 1 | import{a}from"./chunk-334IV3XH.min.js";import"./chunk-P42HNYSU.min.js";export default a(); 2 | //# sourceMappingURL=lunr.ja-6645DQV5.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/lunr.ja-J6QHZSR2.min.js: -------------------------------------------------------------------------------- 1 | import{a}from"./chunk-DTUU2GN4.min.js";import"./chunk-OSRY5VT3.min.js";export default a(); 2 | //# sourceMappingURL=lunr.ja-J6QHZSR2.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/lunr.ja-RG3AQVTE.min.js: -------------------------------------------------------------------------------- 1 | import{a}from"./chunk-NRE4YRK7.min.js";import"./chunk-XUHMPXWX.min.js";export default a(); 2 | //# sourceMappingURL=lunr.ja-RG3AQVTE.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/ScrollDirection.cs: -------------------------------------------------------------------------------- 1 | namespace WpfToolkit.Controls 2 | { 3 | public enum ScrollDirection 4 | { 5 | Vertical, 6 | Horizontal 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /docs/public/lunr.jp-2KRE2L63.min.js: -------------------------------------------------------------------------------- 1 | import{a as i}from"./chunk-334IV3XH.min.js";import{b as r}from"./chunk-P42HNYSU.min.js";var o=r((p,e)=>{e.exports=i()});export default o(); 2 | //# sourceMappingURL=lunr.jp-2KRE2L63.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/lunr.jp-M45D3XJE.min.js: -------------------------------------------------------------------------------- 1 | import{a as i}from"./chunk-DTUU2GN4.min.js";import{a as r}from"./chunk-OSRY5VT3.min.js";var o=r((p,e)=>{e.exports=i()});export default o(); 2 | //# sourceMappingURL=lunr.jp-M45D3XJE.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/lunr.jp-P5CLAZPO.min.js: -------------------------------------------------------------------------------- 1 | import{a as i}from"./chunk-NRE4YRK7.min.js";import{b as r}from"./chunk-XUHMPXWX.min.js";var o=r((p,e)=>{e.exports=i()});export default o(); 2 | //# sourceMappingURL=lunr.jp-P5CLAZPO.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/docfx/filter.yml: -------------------------------------------------------------------------------- 1 | apiRules: 2 | - exclude: 3 | hasAttribute: 4 | uid: System.ObsoleteAttribute 5 | - exclude: 6 | uidRegex: ^WpfToolkit\.Controls\.ScrollDirection 7 | type: Enum 8 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamplesFW/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /docs/public/mermaid.core-SEZKZMNB.min.js: -------------------------------------------------------------------------------- 1 | import{J as m,b as r,c as t,sb as p}from"./chunk-YEACHCAA.min.js";import{d as o}from"./chunk-XUHMPXWX.min.js";var e=o(r(),1),f=o(t(),1);var l=o(m(),1);export{p as default}; 2 | //# sourceMappingURL=mermaid.core-SEZKZMNB.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/mermaid.core-TOXYJXQE.min.js: -------------------------------------------------------------------------------- 1 | import{J as m,b as r,c as t,qb as p}from"./chunk-YICCS3KT.min.js";import{d as o}from"./chunk-P42HNYSU.min.js";var e=o(r(),1),f=o(t(),1);var l=o(m(),1);export{p as default}; 2 | //# sourceMappingURL=mermaid.core-TOXYJXQE.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/chunk-I4ZXTPQC.min.js: -------------------------------------------------------------------------------- 1 | import{h as t}from"./chunk-U3SD26FK.min.js";var s=class{constructor(i){this.init=i,this.records=this.init()}static{t(this,"ImperativeState")}reset(){this.records=this.init()}};export{s as a}; 2 | //# sourceMappingURL=chunk-I4ZXTPQC.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamplesFW/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamplesFW/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace VirtualizingWrapPanelSamplesFW 4 | { 5 | /// 6 | /// Interaction logic for App.xaml 7 | /// 8 | public partial class App : Application 9 | { 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /docs/public/chunk-EKP7MBOP.min.js: -------------------------------------------------------------------------------- 1 | import{h as i}from"./chunk-U3SD26FK.min.js";function t(c,e){c.accDescr&&e.setAccDescription?.(c.accDescr),c.accTitle&&e.setAccTitle?.(c.accTitle),c.title&&e.setDiagramTitle?.(c.title)}i(t,"populateCommonDb");export{t as a}; 2 | //# sourceMappingURL=chunk-EKP7MBOP.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/chunk-EDJWACL4.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/chunk-K6PMAZHR.mjs"], 4 | "sourcesContent": ["// package.json\nvar version = \"11.4.1\";\n\nexport {\n version\n};\n"], 5 | "mappings": "AACA,IAAIA,EAAU", 6 | "names": ["version"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/toc.json: -------------------------------------------------------------------------------- 1 | 2 | {"items":[{"name":"Documentation","href":"docs/getting-started.html","tocHref":"docs/toc.html","topicHref":"docs/getting-started.html"},{"name":"API","href":"api/WpfToolkit.Controls.html","tocHref":"api/toc.html","topicHref":"api/WpfToolkit.Controls.html","topicUid":"WpfToolkit.Controls"}],"pdf":false} 3 | -------------------------------------------------------------------------------- /docs/public/chunk-5IIW54K6.min.js: -------------------------------------------------------------------------------- 1 | import{Z as s,h as n,ia as e}from"./chunk-U3SD26FK.min.js";var a=n(t=>{let{securityLevel:c}=s(),o=e("body");if(c==="sandbox"){let m=e(`#i${t}`).node()?.contentDocument??document;o=e(m.body)}return o.select(`#${t}`)},"selectSvgElement");export{a}; 2 | //# sourceMappingURL=chunk-5IIW54K6.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | _layout: landing 3 | --- 4 | 5 | # This is the **HOMEPAGE**. 6 | 7 | Refer to [Markdown](http://daringfireball.net/projects/markdown/) for how to write markdown files. 8 | 9 | ## Quick Start Notes: 10 | 11 | 1. Add images to the *images* folder if the file is referencing an image. -------------------------------------------------------------------------------- /docs/public/pie-BEWT4RHE-VFWRUT6J.min.js: -------------------------------------------------------------------------------- 1 | import{a as e,b as r}from"./chunk-PDS7545E.min.js";import"./chunk-BIJFJY5F.min.js";import"./chunk-U4DUTLYF.min.js";import"./chunk-IQQ46AC6.min.js";import"./chunk-CXRPJJJE.min.js";import"./chunk-OSRY5VT3.min.js";export{e as PieModule,r as createPieServices}; 2 | //# sourceMappingURL=pie-BEWT4RHE-VFWRUT6J.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/info-46DW6VJ7-RDUIJSMX.min.js: -------------------------------------------------------------------------------- 1 | import{a as o,b as e}from"./chunk-33FU46FA.min.js";import"./chunk-BIJFJY5F.min.js";import"./chunk-U4DUTLYF.min.js";import"./chunk-IQQ46AC6.min.js";import"./chunk-CXRPJJJE.min.js";import"./chunk-OSRY5VT3.min.js";export{o as InfoModule,e as createInfoServices}; 2 | //# sourceMappingURL=info-46DW6VJ7-RDUIJSMX.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/chunk-V55NTXQN.min.js: -------------------------------------------------------------------------------- 1 | import{h as i}from"./chunk-U3SD26FK.min.js";var o=i(({flowchart:t})=>{let r=t?.subGraphTitleMargin?.top??0,a=t?.subGraphTitleMargin?.bottom??0,e=r+a;return{subGraphTitleTopMargin:r,subGraphTitleBottomMargin:a,subGraphTitleTotalMargin:e}},"getSubGraphTitleMargins");export{o as a}; 2 | //# sourceMappingURL=chunk-V55NTXQN.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/packet-W2GHVCYJ-ZZMTAWKW.min.js: -------------------------------------------------------------------------------- 1 | import{a as e,b as r}from"./chunk-OZ2RCKQJ.min.js";import"./chunk-BIJFJY5F.min.js";import"./chunk-U4DUTLYF.min.js";import"./chunk-IQQ46AC6.min.js";import"./chunk-CXRPJJJE.min.js";import"./chunk-OSRY5VT3.min.js";export{e as PacketModule,r as createPacketServices}; 2 | //# sourceMappingURL=packet-W2GHVCYJ-ZZMTAWKW.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/gitGraph-YCYPL57B-3XOJ53I6.min.js: -------------------------------------------------------------------------------- 1 | import{a as r,b as e}from"./chunk-UEFJDIUO.min.js";import"./chunk-BIJFJY5F.min.js";import"./chunk-U4DUTLYF.min.js";import"./chunk-IQQ46AC6.min.js";import"./chunk-CXRPJJJE.min.js";import"./chunk-OSRY5VT3.min.js";export{r as GitGraphModule,e as createGitGraphServices}; 2 | //# sourceMappingURL=gitGraph-YCYPL57B-3XOJ53I6.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/architecture-I3QFYML2-2T2ZUHXO.min.js: -------------------------------------------------------------------------------- 1 | import{a as e,b as r}from"./chunk-IJ4BRSPX.min.js";import"./chunk-BIJFJY5F.min.js";import"./chunk-U4DUTLYF.min.js";import"./chunk-IQQ46AC6.min.js";import"./chunk-CXRPJJJE.min.js";import"./chunk-OSRY5VT3.min.js";export{e as ArchitectureModule,r as createArchitectureServices}; 2 | //# sourceMappingURL=architecture-I3QFYML2-2T2ZUHXO.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelTest/TestItemSizeProvider.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | using WpfToolkit.Controls; 3 | 4 | namespace VirtualizingWrapPanelTest; 5 | 6 | internal class TestItemSizeProvider : IItemSizeProvider 7 | { 8 | public Size GetSizeForItem(object item) 9 | { 10 | var testItem = (TestItem)item; 11 | return new Size(testItem.Width, testItem.Height); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/IItemSizeProvider.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace WpfToolkit.Controls; 4 | 5 | /// 6 | /// Provides the size of items displayed in an VirtualizingPanel. 7 | /// 8 | public interface IItemSizeProvider 9 | { 10 | /// 11 | /// Gets the size for the specified item. 12 | /// 13 | Size GetSizeForItem(object item); 14 | } 15 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamplesFW/App.xaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamples/TestItemSizeProvider.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | using WpfToolkit.Controls; 3 | 4 | namespace VirtualizingWrapPanelSamples 5 | { 6 | internal class TestItemSizeProvider : IItemSizeProvider 7 | { 8 | public Size GetSizeForItem(object item) 9 | { 10 | var testItem = (TestItem)item; 11 | return new Size(testItem.Size.Width + 10, testItem.Size.Height + 4); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelTest/Mocks/LazyTestItem.cs: -------------------------------------------------------------------------------- 1 | namespace VirtualizingWrapPanelTest.Mocks; 2 | 3 | internal class LazyTestItem : TestItem 4 | { 5 | public double FirstTimeWidth { get; } 6 | 7 | public double FirstTimeHeight { get; } 8 | 9 | public LazyTestItem() 10 | { 11 | var random = new Random(); 12 | FirstTimeWidth = Math.Round(Width * 0.5); 13 | FirstTimeHeight = Math.Round(Height * 0.5); 14 | } 15 | } 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/PolyfillExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace WpfToolkit.Controls; 4 | 5 | internal static class PolyfillExtensions 6 | { 7 | 8 | #if NETFRAMEWORK 9 | 10 | public static void Deconstruct( 11 | this KeyValuePair target, 12 | out TKey key, 13 | out TValue value) 14 | { 15 | key = target.Key; 16 | value = target.Value; 17 | } 18 | 19 | #endif 20 | 21 | } 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/default-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Issue Template 3 | about: Template for creating an issue. 4 | title: '' 5 | labels: '' 6 | assignees: 'sbaeumlisberger' 7 | 8 | --- 9 | 10 | **Describe your issue** 11 | A clear and concise description of your issue. If you believe it is a bug, please provide the steps to reproduce (code snippets or a sample project are helpful). 12 | 13 | **Version Info** 14 | Package Version: [e.g. 1.5.2] 15 | .NET Version: [e.g. .NET Framework 4.7.2] 16 | -------------------------------------------------------------------------------- /SamplesApplication.md: -------------------------------------------------------------------------------- 1 | ## Samples Application 2 | 3 | Here you can download the latest executable: 4 | * [Windows 64 Bit](https://github.com/sbaeumlisberger/VirtualizingWrapPanel/releases/download/v2.3.2/VirtualizingWrapPanelSamples.exe) 5 | 6 | Alternatively, you can clone the repository and build the project in the folder `src/VirtualizingWrapPanelSamples`. 7 | 8 | If you just want to have a look at the code, follow this [link](https://github.com/sbaeumlisberger/VirtualizingWrapPanel/tree/master/src/VirtualizingWrapPanelSamples). 9 | -------------------------------------------------------------------------------- /docs/public/chunk-33FU46FA.min.js: -------------------------------------------------------------------------------- 1 | import{a as t,b as a,c as o,d as i,e as f,f as e,g as u,h as d,n as s,o as l}from"./chunk-BIJFJY5F.min.js";var m=class extends l{static{e(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},v={parser:{TokenBuilder:e(()=>new m,"TokenBuilder"),ValueConverter:e(()=>new s,"ValueConverter")}};function I(c=i){let r=o(a(c),u),n=o(t({shared:r}),d,v);return r.ServiceRegistry.register(n),{shared:r,Info:n}}e(I,"createInfoServices");export{v as a,I as b}; 2 | //# sourceMappingURL=chunk-33FU46FA.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/chunk-OZ2RCKQJ.min.js: -------------------------------------------------------------------------------- 1 | import{a as o,b as c,c as t,d as n,e as k,f as e,g as i,i as u,n as d,o as l}from"./chunk-BIJFJY5F.min.js";var m=class extends l{static{e(this,"PacketTokenBuilder")}constructor(){super(["packet-beta"])}},v={parser:{TokenBuilder:e(()=>new m,"TokenBuilder"),ValueConverter:e(()=>new d,"ValueConverter")}};function p(s=n){let r=t(c(s),i),a=t(o({shared:r}),u,v);return r.ServiceRegistry.register(a),{shared:r,Packet:a}}e(p,"createPacketServices");export{v as a,p as b}; 2 | //# sourceMappingURL=chunk-OZ2RCKQJ.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/chunk-UEFJDIUO.min.js: -------------------------------------------------------------------------------- 1 | import{a as i,b as o,c as t,d as n,e as c,f as e,g as u,l as d,n as l,o as s}from"./chunk-BIJFJY5F.min.js";var p=class extends s{static{e(this,"GitGraphTokenBuilder")}constructor(){super(["gitGraph"])}},h={parser:{TokenBuilder:e(()=>new p,"TokenBuilder"),ValueConverter:e(()=>new l,"ValueConverter")}};function m(G=n){let r=t(o(G),u),a=t(i({shared:r}),d,h);return r.ServiceRegistry.register(a),{shared:r,GitGraph:a}}e(m,"createGitGraphServices");export{h as a,m as b}; 2 | //# sourceMappingURL=chunk-UEFJDIUO.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/lunr.jp-2KRE2L63.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/lunr-languages/lunr.jp.js"], 4 | "sourcesContent": ["// jp is the country code, while ja is the language code\n// a new lunr.ja.js has been created, but in order to\n// keep the backward compatibility, we'll leave the lunr.jp.js\n// here for a while, and just make it use the new lunr.ja.js\nmodule.exports = require('./lunr.ja');"], 5 | "mappings": "wFAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAIAA,EAAO,QAAU", 6 | "names": ["require_lunr_jp", "__commonJSMin", "exports", "module"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/lunr.jp-M45D3XJE.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/lunr-languages/lunr.jp.js"], 4 | "sourcesContent": ["// jp is the country code, while ja is the language code\n// a new lunr.ja.js has been created, but in order to\n// keep the backward compatibility, we'll leave the lunr.jp.js\n// here for a while, and just make it use the new lunr.ja.js\nmodule.exports = require('./lunr.ja');"], 5 | "mappings": "wFAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAIAA,EAAO,QAAU", 6 | "names": ["require_lunr_jp", "__commonJSMin", "exports", "module"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/lunr.jp-P5CLAZPO.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/lunr-languages/lunr.jp.js"], 4 | "sourcesContent": ["// jp is the country code, while ja is the language code\n// a new lunr.ja.js has been created, but in order to\n// keep the backward compatibility, we'll leave the lunr.jp.js\n// here for a while, and just make it use the new lunr.ja.js\nmodule.exports = require('./lunr.ja');"], 5 | "mappings": "wFAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAIAA,EAAO,QAAU", 6 | "names": ["require_lunr_jp", "__commonJSMin", "exports", "module"] 7 | } 8 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamples/VirtualizingWrapPanelSamples.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | WinExe 5 | net6.0-windows 6 | true 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /docs/public/mermaid.core-SEZKZMNB.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/mermaid.core.mjs"], 4 | "sourcesContent": ["import \"ts-dedent\";\nimport { N } from \"./mermaid-6dc72991.js\";\nimport \"dayjs\";\nimport \"@braintree/sanitize-url\";\nimport \"d3\";\nimport \"dompurify\";\nimport \"khroma\";\nimport \"lodash-es/memoize.js\";\nimport \"lodash-es/merge.js\";\nimport \"stylis\";\nimport \"lodash-es/isEmpty.js\";\nexport {\n N as default\n};\n"], 5 | "mappings": "8GAEA,IAAAA,EAAO,SACPC,EAAO,SAEP,IAAAC,EAAO", 6 | "names": ["import_dayjs", "import_sanitize_url", "import_dompurify"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/mermaid.core-TOXYJXQE.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/mermaid.core.mjs"], 4 | "sourcesContent": ["import \"ts-dedent\";\nimport { L } from \"./mermaid-934d9bea.js\";\nimport \"dayjs\";\nimport \"@braintree/sanitize-url\";\nimport \"d3\";\nimport \"dompurify\";\nimport \"khroma\";\nimport \"lodash-es/memoize.js\";\nimport \"lodash-es/merge.js\";\nimport \"stylis\";\nimport \"lodash-es/isEmpty.js\";\nexport {\n L as default\n};\n"], 5 | "mappings": "8GAEA,IAAAA,EAAO,SACPC,EAAO,SAEP,IAAAC,EAAO", 6 | "names": ["import_dayjs", "import_sanitize_url", "import_dompurify"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/chunk-PDS7545E.min.js: -------------------------------------------------------------------------------- 1 | import{a as o,b as n,c as a,d as s,e as m,f as e,g as u,j as d,m as c,o as l}from"./chunk-BIJFJY5F.min.js";var v=class extends l{static{e(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},C=class extends c{static{e(this,"PieValueConverter")}runCustomConverter(t,r,i){if(t.name==="PIE_SECTION_LABEL")return r.replace(/"/g,"").trim()}},P={parser:{TokenBuilder:e(()=>new v,"TokenBuilder"),ValueConverter:e(()=>new C,"ValueConverter")}};function p(t=s){let r=a(n(t),u),i=a(o({shared:r}),d,P);return r.ServiceRegistry.register(i),{shared:r,Pie:i}}e(p,"createPieServices");export{P as a,p as b}; 2 | //# sourceMappingURL=chunk-PDS7545E.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamples/ColorToBrushConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Windows.Data; 4 | using System.Windows.Media; 5 | 6 | namespace VirtualizingWrapPanelSamples 7 | { 8 | class ColorToBrushConverter : IValueConverter 9 | { 10 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 11 | { 12 | return new SolidColorBrush((Color)value); 13 | } 14 | 15 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 16 | { 17 | return ((SolidColorBrush)value).Color; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /docs/public/chunk-OSRY5VT3.min.js: -------------------------------------------------------------------------------- 1 | var h=Object.create;var f=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty;var m=(b,a)=>()=>(a||b((a={exports:{}}).exports,a),a.exports),n=(b,a)=>{for(var c in a)f(b,c,{get:a[c],enumerable:!0})},e=(b,a,c,g)=>{if(a&&typeof a=="object"||typeof a=="function")for(let d of j(a))!l.call(b,d)&&d!==c&&f(b,d,{get:()=>a[d],enumerable:!(g=i(a,d))||g.enumerable});return b},o=(b,a,c)=>(e(b,a,"default"),c&&e(c,a,"default")),p=(b,a,c)=>(c=b!=null?h(k(b)):{},e(a||!b||!b.__esModule?f(c,"default",{value:b,enumerable:!0}):c,b));export{m as a,n as b,o as c,p as d}; 2 | //# sourceMappingURL=chunk-OSRY5VT3.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamples/BoolToVisibilityConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Windows; 4 | using System.Windows.Data; 5 | 6 | namespace VirtualizingWrapPanelSamples 7 | { 8 | class BoolToVisibilityConverter : IValueConverter 9 | { 10 | 11 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 12 | { 13 | return (bool)value ? Visibility.Visible : Visibility.Collapsed; 14 | } 15 | 16 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 17 | { 18 | throw new NotImplementedException(); 19 | } 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /docs/public/chunk-ISDTAGDN.min.js: -------------------------------------------------------------------------------- 1 | import{O as x,h as r,ia as a,j as h}from"./chunk-U3SD26FK.min.js";var b=r((t,e)=>{let o;return e==="sandbox"&&(o=a("#i"+t)),(e==="sandbox"?a(o.nodes()[0].contentDocument.body):a("body")).select(`[id="${t}"]`)},"getDiagramElement"),B=r((t,e,o,n)=>{t.attr("class",o);let{width:i,height:s,x:m,y:d}=g(t,e);x(t,s,i,n);let c=w(m,d,i,s,e);t.attr("viewBox",c),h.debug(`viewBox configured: ${c} with padding: ${e}`)},"setupViewPortForSVG"),g=r((t,e)=>{let o=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:o.width+e*2,height:o.height+e*2,x:o.x,y:o.y}},"calculateDimensionsWithPadding"),w=r((t,e,o,n,i)=>`${t-i} ${e-i} ${o} ${n}`,"createViewBox");export{b as a,B as b}; 2 | //# sourceMappingURL=chunk-ISDTAGDN.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/ItemAlignment.cs: -------------------------------------------------------------------------------- 1 | namespace WpfToolkit.Controls; 2 | 3 | /// 4 | /// Specifies how items are aligned on the cross axis of a . 5 | /// 6 | public enum ItemAlignment 7 | { 8 | /// 9 | /// The items are placed at the start of the cross axis. 10 | /// 11 | Start, 12 | /// 13 | /// The items are centered om the cross-axis. 14 | /// 15 | Center, 16 | /// 17 | /// The items are placed at the end of the cross axis. 18 | /// 19 | End, 20 | /// 21 | /// The items are stretched to fill the cross axis. 22 | /// 23 | Stretch 24 | } 25 | -------------------------------------------------------------------------------- /docs/public/flowDiagram-v2-2f8f667a-WVVXSXHH.min.js: -------------------------------------------------------------------------------- 1 | import{g as i,h as p}from"./chunk-U66T5BMR.min.js";import"./chunk-YAMJ4ASO.min.js";import{a as m,b as o}from"./chunk-I64Z623A.min.js";import"./chunk-3RELVOUY.min.js";import"./chunk-DALFUHAB.min.js";import"./chunk-EKFGDCJ4.min.js";import{J as l,b as a,c as s,kb as e}from"./chunk-YICCS3KT.min.js";import{d as t}from"./chunk-P42HNYSU.min.js";var g=t(a(),1),n=t(s(),1),c=t(l(),1);var y={parser:m,db:o,renderer:i,styles:p,init:r=>{r.flowchart||(r.flowchart={}),r.flowchart.arrowMarkerAbsolute=r.arrowMarkerAbsolute,e({flowchart:{arrowMarkerAbsolute:r.arrowMarkerAbsolute}}),i.setConf(r.flowchart),o.clear(),o.setGen("gen-2")}};export{y as diagram}; 2 | //# sourceMappingURL=flowDiagram-v2-2f8f667a-WVVXSXHH.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamples/App.xaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /docs/public/classDiagram-LNE6IOMH-VZ67B4ZP.min.js: -------------------------------------------------------------------------------- 1 | import{a as e,b as a,c as i,d as s}from"./chunk-54U54PUP.min.js";import"./chunk-ISDTAGDN.min.js";import"./chunk-JL3VILNY.min.js";import"./chunk-TLYS76Q7.min.js";import"./chunk-CLIYZZ5Y.min.js";import"./chunk-N6ME3NZU.min.js";import"./chunk-V55NTXQN.min.js";import"./chunk-BD4P4Z7J.min.js";import"./chunk-AUO2PXKS.min.js";import"./chunk-PYPO7LRM.min.js";import"./chunk-CM5D5KZN.min.js";import{h as t}from"./chunk-U3SD26FK.min.js";import"./chunk-CXRPJJJE.min.js";import"./chunk-OSRY5VT3.min.js";var g={parser:e,db:a,renderer:s,styles:i,init:t(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute,a.clear()},"init")};export{g as diagram}; 2 | //# sourceMappingURL=classDiagram-LNE6IOMH-VZ67B4ZP.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/stateDiagram-v2-4JROLMXI-COTI64PW.min.js: -------------------------------------------------------------------------------- 1 | import{a,b as i,c as r,d as o}from"./chunk-6YMKSKZH.min.js";import"./chunk-ISDTAGDN.min.js";import"./chunk-JL3VILNY.min.js";import"./chunk-TLYS76Q7.min.js";import"./chunk-CLIYZZ5Y.min.js";import"./chunk-N6ME3NZU.min.js";import"./chunk-V55NTXQN.min.js";import"./chunk-BD4P4Z7J.min.js";import"./chunk-AUO2PXKS.min.js";import"./chunk-PYPO7LRM.min.js";import"./chunk-CM5D5KZN.min.js";import{h as e}from"./chunk-U3SD26FK.min.js";import"./chunk-CXRPJJJE.min.js";import"./chunk-OSRY5VT3.min.js";var k={parser:a,db:r,renderer:i,styles:o,init:e(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,r.clear()},"init")};export{k as diagram}; 2 | //# sourceMappingURL=stateDiagram-v2-4JROLMXI-COTI64PW.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/pack.ps1: -------------------------------------------------------------------------------- 1 | $gitStatus = git status --porcelain 2 | 3 | if ($gitStatus) { 4 | Write-Host "There are uncommitted changes in the repository. Please commit or stash them before running this script." 5 | exit 1 6 | } 7 | 8 | $currentBranch = git rev-parse --abbrev-ref HEAD 9 | 10 | if ($currentBranch -ne "master") { 11 | Write-Host "You are not on the master branch. Please switch to the master branch before running this script." 12 | exit 1 13 | } 14 | 15 | git fetch 16 | 17 | $gitStatus = git status 18 | 19 | if ($gitStatus -match "Your branch is ahead") { 20 | Write-Host "There are local commits that have not been pushed to the remote." 21 | exit 1 22 | } 23 | 24 | dotnet pack /p:ContinuousIntegrationBuild=true -------------------------------------------------------------------------------- /docs/public/classDiagram-v2-MQ7JQ4JX-4JTAVB6L.min.js: -------------------------------------------------------------------------------- 1 | import{a as e,b as a,c as i,d as s}from"./chunk-54U54PUP.min.js";import"./chunk-ISDTAGDN.min.js";import"./chunk-JL3VILNY.min.js";import"./chunk-TLYS76Q7.min.js";import"./chunk-CLIYZZ5Y.min.js";import"./chunk-N6ME3NZU.min.js";import"./chunk-V55NTXQN.min.js";import"./chunk-BD4P4Z7J.min.js";import"./chunk-AUO2PXKS.min.js";import"./chunk-PYPO7LRM.min.js";import"./chunk-CM5D5KZN.min.js";import{h as t}from"./chunk-U3SD26FK.min.js";import"./chunk-CXRPJJJE.min.js";import"./chunk-OSRY5VT3.min.js";var g={parser:e,db:a,renderer:s,styles:i,init:t(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute,a.clear()},"init")};export{g as diagram}; 2 | //# sourceMappingURL=classDiagram-v2-MQ7JQ4JX-4JTAVB6L.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/flowDiagram-v2-13329dc7-7HQDDRUE.min.js: -------------------------------------------------------------------------------- 1 | import{g as i,h as p}from"./chunk-LUX5WYVM.min.js";import"./chunk-5FWMXAFW.min.js";import{a as m,b as o}from"./chunk-CA32PY7O.min.js";import"./chunk-N4EFGQ5G.min.js";import"./chunk-LXB37CFX.min.js";import"./chunk-RNO6SWHZ.min.js";import"./chunk-K2MRC2FE.min.js";import{J as l,b as a,c as s,ob as e}from"./chunk-YEACHCAA.min.js";import{d as t}from"./chunk-XUHMPXWX.min.js";var g=t(a(),1),n=t(s(),1),c=t(l(),1);var y={parser:m,db:o,renderer:i,styles:p,init:r=>{r.flowchart||(r.flowchart={}),r.flowchart.arrowMarkerAbsolute=r.arrowMarkerAbsolute,e({flowchart:{arrowMarkerAbsolute:r.arrowMarkerAbsolute}}),i.setConf(r.flowchart),o.clear(),o.setGen("gen-2")}};export{y as diagram}; 2 | //# sourceMappingURL=flowDiagram-v2-13329dc7-7HQDDRUE.min.js.map 3 | -------------------------------------------------------------------------------- /docs/docs/toc.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 | 7 | 8 | 9 |
10 |
11 |
12 |
13 | 14 | 19 |
20 |
21 |
22 |
23 | -------------------------------------------------------------------------------- /docs/public/chunk-IJ4BRSPX.min.js: -------------------------------------------------------------------------------- 1 | import{a as i,b as u,c as a,d as n,e as m,f as r,g as o,k as s,m as l,o as d}from"./chunk-BIJFJY5F.min.js";var h=class extends d{static{r(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},A=class extends l{static{r(this,"ArchitectureValueConverter")}runCustomConverter(t,e,c){if(t.name==="ARCH_ICON")return e.replace(/[()]/g,"").trim();if(t.name==="ARCH_TEXT_ICON")return e.replace(/["()]/g,"");if(t.name==="ARCH_TITLE")return e.replace(/[[\]]/g,"").trim()}},C={parser:{TokenBuilder:r(()=>new h,"TokenBuilder"),ValueConverter:r(()=>new A,"ValueConverter")}};function v(t=n){let e=a(u(t),o),c=a(i({shared:e}),s,C);return e.ServiceRegistry.register(c),{shared:e,Architecture:c}}r(v,"createArchitectureServices");export{C as a,v as b}; 2 | //# sourceMappingURL=chunk-IJ4BRSPX.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/chunk-I4ZXTPQC.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/chunk-KFBOBJHC.mjs"], 4 | "sourcesContent": ["import {\n __name\n} from \"./chunk-6DBFFHIP.mjs\";\n\n// src/utils/imperativeState.ts\nvar ImperativeState = class {\n /**\n * @param init - Function that creates the default state.\n */\n constructor(init) {\n this.init = init;\n this.records = this.init();\n }\n static {\n __name(this, \"ImperativeState\");\n }\n reset() {\n this.records = this.init();\n }\n};\n\nexport {\n ImperativeState\n};\n"], 5 | "mappings": "4CAKA,IAAIA,EAAkB,KAAM,CAI1B,YAAYC,EAAM,CAChB,KAAK,KAAOA,EACZ,KAAK,QAAU,KAAK,KAAK,CAC3B,CACA,MAAO,CACLC,EAAO,KAAM,iBAAiB,CAChC,CACA,OAAQ,CACN,KAAK,QAAU,KAAK,KAAK,CAC3B,CACF", 6 | "names": ["ImperativeState", "init", "__name"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/chunk-EKP7MBOP.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/chunk-TMUBEWPD.mjs"], 4 | "sourcesContent": ["import {\n __name\n} from \"./chunk-6DBFFHIP.mjs\";\n\n// src/diagrams/common/populateCommonDb.ts\nfunction populateCommonDb(ast, db) {\n if (ast.accDescr) {\n db.setAccDescription?.(ast.accDescr);\n }\n if (ast.accTitle) {\n db.setAccTitle?.(ast.accTitle);\n }\n if (ast.title) {\n db.setDiagramTitle?.(ast.title);\n }\n}\n__name(populateCommonDb, \"populateCommonDb\");\n\nexport {\n populateCommonDb\n};\n"], 5 | "mappings": "4CAKA,SAASA,EAAiBC,EAAKC,EAAI,CAC7BD,EAAI,UACNC,EAAG,oBAAoBD,EAAI,QAAQ,EAEjCA,EAAI,UACNC,EAAG,cAAcD,EAAI,QAAQ,EAE3BA,EAAI,OACNC,EAAG,kBAAkBD,EAAI,KAAK,CAElC,CACAE,EAAOH,EAAkB,kBAAkB", 6 | "names": ["populateCommonDb", "ast", "db", "__name"] 7 | } 8 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelTest/Mocks/TestItem.cs: -------------------------------------------------------------------------------- 1 | namespace VirtualizingWrapPanelTest.Mocks; 2 | 3 | internal class TestItem 4 | { 5 | 6 | public double Width { get; } 7 | 8 | public double Height { get; } 9 | 10 | public string ID { get; set; } = Guid.NewGuid().ToString(); 11 | 12 | public TestItem(double width, double height) 13 | { 14 | Width = width; 15 | Height = height; 16 | } 17 | 18 | public TestItem() 19 | { 20 | var random = new Random(); 21 | Width = random.Next(100, 201); 22 | Height = random.Next(100, 201); 23 | } 24 | 25 | public override bool Equals(object? obj) 26 | { 27 | return obj is TestItem other && Equals(ID, other.ID); 28 | } 29 | 30 | public override int GetHashCode() 31 | { 32 | return ID.GetHashCode(); 33 | } 34 | } 35 | 36 | 37 | -------------------------------------------------------------------------------- /docs/public/chunk-P42HNYSU.min.js: -------------------------------------------------------------------------------- 1 | var g=Object.create;var e=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var m=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var n=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports),o=(a,b)=>{for(var c in b)e(a,c,{get:b[c],enumerable:!0})},l=(a,b,c,f)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of i(b))!k.call(a,d)&&d!==c&&e(a,d,{get:()=>b[d],enumerable:!(f=h(b,d))||f.enumerable});return a};var p=(a,b,c)=>(c=a!=null?g(j(a)):{},l(b||!a||!a.__esModule?e(c,"default",{value:a,enumerable:!0}):c,a));export{m as a,n as b,o as c,p as d}; 2 | //# sourceMappingURL=chunk-P42HNYSU.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/chunk-XUHMPXWX.min.js: -------------------------------------------------------------------------------- 1 | var g=Object.create;var e=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var m=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var n=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports),o=(a,b)=>{for(var c in b)e(a,c,{get:b[c],enumerable:!0})},l=(a,b,c,f)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of i(b))!k.call(a,d)&&d!==c&&e(a,d,{get:()=>b[d],enumerable:!(f=h(b,d))||f.enumerable});return a};var p=(a,b,c)=>(c=a!=null?g(j(a)):{},l(b||!a||!a.__esModule?e(c,"default",{value:a,enumerable:!0}):c,a));export{m as a,n as b,o as c,p as d}; 2 | //# sourceMappingURL=chunk-XUHMPXWX.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamples/Properties/PublishProfiles/Win-x64.pubxml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | FileSystem 8 | Release 9 | Any CPU 10 | net6.0-windows 11 | bin\Release\net6.0-windows\publish\x64\ 12 | win-x64 13 | true 14 | True 15 | True 16 | True 17 | embedded 18 | 19 | -------------------------------------------------------------------------------- /docs/toc.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 | 7 | 8 | 9 |
10 |
11 |
12 |
13 | 14 | 22 |
23 |
24 |
25 |
26 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/docfx/docfx.json: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": [ 3 | { 4 | "src": [ 5 | { 6 | "src": "../", 7 | "files": [ 8 | "**/*.csproj" 9 | ] 10 | } 11 | ], 12 | "filter": "filter.yml", 13 | "dest": "api" 14 | } 15 | ], 16 | "build": { 17 | "content": [ 18 | { 19 | "files": [ 20 | "**/*.{md,yml}" 21 | ], 22 | "exclude": [ 23 | "_site/**" 24 | ] 25 | } 26 | ], 27 | "resource": [ 28 | { 29 | "files": [ 30 | "images/**" 31 | ] 32 | } 33 | ], 34 | "output": "../../../docs", 35 | "template": [ 36 | "default", 37 | "modern", 38 | "custom" 39 | ], 40 | "globalMetadata": { 41 | "_appName": "VirtualizingWrapPanel", 42 | "_appTitle": "VirtualizingWrapPanel", 43 | "_enableSearch": false, 44 | "pdf": false 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/SpacingMode.cs: -------------------------------------------------------------------------------- 1 | namespace WpfToolkit.Controls 2 | { 3 | /// 4 | /// Specifies how remaining space is distributed. 5 | /// 6 | public enum SpacingMode 7 | { 8 | /// 9 | /// Spacing is disabled and all items will be arranged as closely as possible. 10 | /// 11 | None, 12 | /// 13 | /// The remaining space is evenly distributed between the items on a layout row, as well as the start and end of each row. 14 | /// 15 | Uniform, 16 | /// 17 | /// The remaining space is evenly distributed between the items on a layout row, excluding the start and end of each row. 18 | /// 19 | BetweenItemsOnly, 20 | /// 21 | /// The remaining space is evenly distributed between start and end of each row. 22 | /// 23 | StartAndEndOnly 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/Utils.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace WpfToolkit.Controls; 4 | 5 | internal class Utils 6 | { 7 | /// 8 | /// Creates a HashSet from a range of elements in a collection. 9 | /// Start and end index are inclusive and can be out of bounds. 10 | /// 11 | /// Index of the first item to take (inclusive). 12 | /// Index of the last item to take (inclusive). 13 | public static HashSet HashSetOfRange(IList collection, int startIndex, int endIndex) 14 | { 15 | var hashSet = new HashSet(); 16 | if (startIndex >= 0) 17 | { 18 | int count = collection.Count; 19 | for (int i = startIndex; i <= endIndex && i < count; i++) 20 | { 21 | hashSet.Add(collection[i]); 22 | } 23 | } 24 | return hashSet; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /docs/public/infoDiagram-A4XQUW5V-SKLVFWJI.min.js: -------------------------------------------------------------------------------- 1 | import{a as s}from"./chunk-EDJWACL4.min.js";import{a as i}from"./chunk-5IIW54K6.min.js";import{a as g}from"./chunk-WXIN66R4.min.js";import"./chunk-33FU46FA.min.js";import"./chunk-OZ2RCKQJ.min.js";import"./chunk-PDS7545E.min.js";import"./chunk-IJ4BRSPX.min.js";import"./chunk-UEFJDIUO.min.js";import"./chunk-BIJFJY5F.min.js";import"./chunk-U4DUTLYF.min.js";import"./chunk-IQQ46AC6.min.js";import{O as n,h as r,j as a}from"./chunk-U3SD26FK.min.js";import"./chunk-CXRPJJJE.min.js";import"./chunk-OSRY5VT3.min.js";var v={parse:r(async e=>{let t=await g("info",e);a.debug(t)},"parse")},d={version:s},m=r(()=>d.version,"getVersion"),c={getVersion:m},f=r((e,t,p)=>{a.debug(`rendering info diagram 2 | `+e);let o=i(t);n(o,100,400,!0),o.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${p}`)},"draw"),l={draw:f},y={parser:v,db:c,renderer:l};export{y as diagram}; 3 | //# sourceMappingURL=infoDiagram-A4XQUW5V-SKLVFWJI.min.js.map 4 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.CompilerServices; 2 | using System.Runtime.InteropServices; 3 | 4 | // In SDK-style projects such as this one, several assembly attributes that were historically 5 | // defined in this file are now automatically added during build and populated with 6 | // values defined in project properties. For details of which attributes are included 7 | // and how to customise this process see: https://aka.ms/assembly-info-properties 8 | 9 | 10 | // Setting ComVisible to false makes the types in this assembly not visible to COM 11 | // components. If you need to access a type in this assembly from COM, set the ComVisible 12 | // attribute to true on that type. 13 | 14 | [assembly: ComVisible(false)] 15 | 16 | // The following GUID is for the ID of the typelib if this project is exposed to COM. 17 | 18 | [assembly: Guid("f3c2fea6-c9db-4f44-81e8-adcb2f93ab19")] 19 | 20 | 21 | [assembly: InternalsVisibleTo("VirtualizingWrapPanelTest")] 22 | [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // Moq 23 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/nuget/README.md: -------------------------------------------------------------------------------- 1 | Feature-rich implementation of a [VirtualizingWrapPanel](https://sbaeumlisberger.github.io/VirtualizingWrapPanel/api/WpfToolkit.Controls.VirtualizingWrapPanel.html) control for WPF. The additional [GridView](https://sbaeumlisberger.github.io/VirtualizingWrapPanel/api/WpfToolkit.Controls.GridView.html) control provides a easy to use out-of-the-box experience. 2 | 3 | ### Features 4 | * High performance (tested with up to 1 million items) 5 | * Horizontal and vertical orientation 6 | * Grouping / hierarchical virtualization 7 | * Configurable spacing behaviour and item alignment 8 | * Caching based on pages, items or pixels 9 | * Displaying different sized items 10 | * Recycling or standard virtualization 11 | 12 | ### Resources 13 | * [Getting started](https://sbaeumlisberger.github.io/VirtualizingWrapPanel/docs/getting-started.html) 14 | * [Sample Application](https://github.com/sbaeumlisberger/VirtualizingWrapPanel/tree/master/SamplesApplication.md) 15 | * [API Documentation](https://sbaeumlisberger.github.io/VirtualizingWrapPanel/api/WpfToolkit.Controls.html) -------------------------------------------------------------------------------- /docs/public/chunk-V55NTXQN.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/chunk-3X56UNUX.mjs"], 4 | "sourcesContent": ["import {\n __name\n} from \"./chunk-6DBFFHIP.mjs\";\n\n// src/utils/subGraphTitleMargins.ts\nvar getSubGraphTitleMargins = /* @__PURE__ */ __name(({\n flowchart\n}) => {\n const subGraphTitleTopMargin = flowchart?.subGraphTitleMargin?.top ?? 0;\n const subGraphTitleBottomMargin = flowchart?.subGraphTitleMargin?.bottom ?? 0;\n const subGraphTitleTotalMargin = subGraphTitleTopMargin + subGraphTitleBottomMargin;\n return {\n subGraphTitleTopMargin,\n subGraphTitleBottomMargin,\n subGraphTitleTotalMargin\n };\n}, \"getSubGraphTitleMargins\");\n\nexport {\n getSubGraphTitleMargins\n};\n"], 5 | "mappings": "4CAKA,IAAIA,EAA0CC,EAAO,CAAC,CACpD,UAAAC,CACF,IAAM,CACJ,IAAMC,EAAyBD,GAAW,qBAAqB,KAAO,EAChEE,EAA4BF,GAAW,qBAAqB,QAAU,EACtEG,EAA2BF,EAAyBC,EAC1D,MAAO,CACL,uBAAAD,EACA,0BAAAC,EACA,yBAAAC,CACF,CACF,EAAG,yBAAyB", 6 | "names": ["getSubGraphTitleMargins", "__name", "flowchart", "subGraphTitleTopMargin", "subGraphTitleBottomMargin", "subGraphTitleTotalMargin"] 7 | } 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 S. Bäumlisberger 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /docs/public/chunk-5IIW54K6.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/chunk-EJ4ZWXGL.mjs"], 4 | "sourcesContent": ["import {\n __name,\n getConfig2 as getConfig\n} from \"./chunk-6DBFFHIP.mjs\";\n\n// src/rendering-util/selectSvgElement.ts\nimport { select } from \"d3\";\nvar selectSvgElement = /* @__PURE__ */ __name((id) => {\n const { securityLevel } = getConfig();\n let root = select(\"body\");\n if (securityLevel === \"sandbox\") {\n const sandboxElement = select(`#i${id}`);\n const doc = sandboxElement.node()?.contentDocument ?? document;\n root = select(doc.body);\n }\n const svg = root.select(`#${id}`);\n return svg;\n}, \"selectSvgElement\");\n\nexport {\n selectSvgElement\n};\n"], 5 | "mappings": "2DAOA,IAAIA,EAAmCC,EAAQC,GAAO,CACpD,GAAM,CAAE,cAAAC,CAAc,EAAIC,EAAU,EAChCC,EAAOC,EAAO,MAAM,EACxB,GAAIH,IAAkB,UAAW,CAE/B,IAAMI,EADiBD,EAAO,KAAKJ,CAAE,EAAE,EACZ,KAAK,GAAG,iBAAmB,SACtDG,EAAOC,EAAOC,EAAI,IAAI,CACxB,CAEA,OADYF,EAAK,OAAO,IAAIH,CAAE,EAAE,CAElC,EAAG,kBAAkB", 6 | "names": ["selectSvgElement", "__name", "id", "securityLevel", "getConfig2", "root", "select_default", "doc"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/chunk-JL3VILNY.min.js: -------------------------------------------------------------------------------- 1 | import{b as u,c as y,d as f,e as h}from"./chunk-TLYS76Q7.min.js";import{b as g,e as m,h as d}from"./chunk-N6ME3NZU.min.js";import{c as l}from"./chunk-PYPO7LRM.min.js";import{D as n,N as s,h as o,j as a}from"./chunk-U3SD26FK.min.js";var p={common:s,getConfig:n,insertCluster:m,insertEdge:f,insertEdgeLabel:u,insertMarkers:h,insertNode:d,interpolateToCurve:l,labelHelper:g,log:a,positionEdgeLabel:y},t={},L=o(r=>{for(let e of r)t[e.name]=e},"registerLayoutLoaders"),w=o(()=>{L([{name:"dagre",loader:o(async()=>await import("./dagre-4EVJKHTY-MHPLGZHX.min.js"),"loader")}])},"registerDefaultLayoutLoaders");w();var R=o(async(r,e)=>{if(!(r.layoutAlgorithm in t))throw new Error(`Unknown layout algorithm: ${r.layoutAlgorithm}`);let i=t[r.layoutAlgorithm];return(await i.loader()).render(r,e,p,{algorithm:i.algorithm})},"render"),_=o((r="",{fallback:e="dagre"}={})=>{if(r in t)return r;if(e in t)return a.warn(`Layout algorithm ${r} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${r} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm");export{L as a,R as b,_ as c}; 2 | //# sourceMappingURL=chunk-JL3VILNY.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamples/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.Windows; 4 | using System.Windows.Controls; 5 | using System.Windows.Threading; 6 | 7 | namespace VirtualizingWrapPanelSamples 8 | { 9 | public partial class App : Application 10 | { 11 | public App() 12 | { 13 | InitializeComponent(); 14 | DispatcherUnhandledException += App_DispatcherUnhandledException; 15 | } 16 | 17 | private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 18 | { 19 | Trace.WriteLine(e.Exception); 20 | 21 | if (e.Exception is InvalidOperationException) 22 | { 23 | e.Handled = true; 24 | var mainWindowModel = ((MainWindow)MainWindow).model; 25 | mainWindowModel.VirtualizationMode = 26 | mainWindowModel.VirtualizationMode == VirtualizationMode.Standard 27 | ? VirtualizationMode.Recycling 28 | : VirtualizationMode.Standard; 29 | MessageBox.Show(e.Exception.Message); 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamplesFW/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace VirtualizingWrapPanelSamplesFW.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.4.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /docs/public/chunk-IQQ46AC6.min.js: -------------------------------------------------------------------------------- 1 | import{B as d,D as v,G as P,a as e,c as u,f as i,g as a,i as m,t as w,v as f,y as b,z as j}from"./chunk-CXRPJJJE.min.js";var A=w(Object.keys,Object),S=A;var C=Object.prototype,V=C.hasOwnProperty;function D(r){if(!f(r))return S(r);var t=[];for(var o in Object(r))V.call(r,o)&&o!="constructor"&&t.push(o);return t}var T=D;var K=a(e,"DataView"),n=K;var N=a(e,"Promise"),s=N;var W=a(e,"Set"),c=W;var B=a(e,"WeakMap"),g=B;var O="[object Map]",z="[object Object]",M="[object Promise]",h="[object Set]",x="[object WeakMap]",k="[object DataView]",E=i(n),G=i(m),L=i(s),q=i(c),F=i(g),p=u;(n&&p(new n(new ArrayBuffer(1)))!=k||m&&p(new m)!=O||s&&p(s.resolve())!=M||c&&p(new c)!=h||g&&p(new g)!=x)&&(p=function(r){var t=u(r),o=t==z?r.constructor:void 0,y=o?i(o):"";if(y)switch(y){case E:return k;case G:return O;case L:return M;case q:return h;case F:return x}return t});var l=p;var H="[object Map]",I="[object Set]",J=Object.prototype,Q=J.hasOwnProperty;function R(r){if(r==null)return!0;if(d(r)&&(j(r)||typeof r=="string"||typeof r.splice=="function"||v(r)||P(r)||b(r)))return!r.length;var t=l(r);if(t==H||t==I)return!r.size;if(f(r))return!T(r).length;for(var o in r)if(Q.call(r,o))return!1;return!0}var kr=R;export{T as a,c as b,l as c,kr as d}; 2 | //# sourceMappingURL=chunk-IQQ46AC6.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/chunk-WXIN66R4.min.js: -------------------------------------------------------------------------------- 1 | import{f as t}from"./chunk-BIJFJY5F.min.js";var a={},o={info:t(async()=>{let{createInfoServices:e}=await import("./info-46DW6VJ7-RDUIJSMX.min.js"),r=e().Info.parser.LangiumParser;a.info=r},"info"),packet:t(async()=>{let{createPacketServices:e}=await import("./packet-W2GHVCYJ-ZZMTAWKW.min.js"),r=e().Packet.parser.LangiumParser;a.packet=r},"packet"),pie:t(async()=>{let{createPieServices:e}=await import("./pie-BEWT4RHE-VFWRUT6J.min.js"),r=e().Pie.parser.LangiumParser;a.pie=r},"pie"),architecture:t(async()=>{let{createArchitectureServices:e}=await import("./architecture-I3QFYML2-2T2ZUHXO.min.js"),r=e().Architecture.parser.LangiumParser;a.architecture=r},"architecture"),gitGraph:t(async()=>{let{createGitGraphServices:e}=await import("./gitGraph-YCYPL57B-3XOJ53I6.min.js"),r=e().GitGraph.parser.LangiumParser;a.gitGraph=r},"gitGraph")};async function n(e,r){let i=o[e];if(!i)throw new Error(`Unknown diagram type: ${e}`);a[e]||await i();let s=a[e].parse(r);if(s.lexerErrors.length>0||s.parserErrors.length>0)throw new p(s);return s.value}t(n,"parse");var p=class extends Error{constructor(e){let r=e.lexerErrors.map(c=>c.message).join(` 2 | `),i=e.parserErrors.map(c=>c.message).join(` 3 | `);super(`Parsing failed: ${r} ${i}`),this.result=e}static{t(this,"MermaidParseError")}};export{n as a}; 4 | //# sourceMappingURL=chunk-WXIN66R4.min.js.map 5 | -------------------------------------------------------------------------------- /docs/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by Docfx 9 | 10 | 12 | 15 | 21 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelTest/VirtualizingWrapPanelTest.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net8.0-windows 5 | enable 6 | enable 7 | false 8 | 9 | 10 | 11 | 12 | 13 | 14 | all 15 | runtime; build; native; contentfiles; analyzers; buildtransitive 16 | 17 | 18 | 19 | all 20 | runtime; build; native; contentfiles; analyzers; buildtransitive 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /docs/public/chunk-F7JJDB3C.min.js: -------------------------------------------------------------------------------- 1 | import{Ha as o,c as l}from"./chunk-YICCS3KT.min.js";import{d as c}from"./chunk-P42HNYSU.min.js";var i=c(l(),1);var x=(s,t)=>{let r=s.append("rect");if(r.attr("x",t.x),r.attr("y",t.y),r.attr("fill",t.fill),r.attr("stroke",t.stroke),r.attr("width",t.width),r.attr("height",t.height),t.rx!==void 0&&r.attr("rx",t.rx),t.ry!==void 0&&r.attr("ry",t.ry),t.attrs!==void 0)for(let e in t.attrs)r.attr(e,t.attrs[e]);return t.class!==void 0&&r.attr("class",t.class),r},h=(s,t)=>{let r={x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,stroke:t.stroke,class:"rect"};x(s,r).lower()},y=(s,t)=>{let r=t.text.replace(o," "),e=s.append("text");e.attr("x",t.x),e.attr("y",t.y),e.attr("class","legend"),e.style("text-anchor",t.anchor),t.class!==void 0&&e.attr("class",t.class);let n=e.append("tspan");return n.attr("x",t.x+t.textMargin*2),n.text(r),e},p=(s,t,r,e)=>{let n=s.append("image");n.attr("x",t),n.attr("y",r);let a=(0,i.sanitizeUrl)(e);n.attr("xlink:href",a)},g=(s,t,r,e)=>{let n=s.append("use");n.attr("x",t),n.attr("y",r);let a=(0,i.sanitizeUrl)(e);n.attr("xlink:href",`#${a}`)},m=()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),f=()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0});export{x as a,h as b,y as c,p as d,g as e,m as f,f as g}; 2 | //# sourceMappingURL=chunk-F7JJDB3C.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/chunk-M7PQX5EB.min.js: -------------------------------------------------------------------------------- 1 | import{Ha as o,c}from"./chunk-YEACHCAA.min.js";import{d as l}from"./chunk-XUHMPXWX.min.js";var i=l(c(),1);var x=(s,t)=>{let r=s.append("rect");if(r.attr("x",t.x),r.attr("y",t.y),r.attr("fill",t.fill),r.attr("stroke",t.stroke),r.attr("width",t.width),r.attr("height",t.height),t.name&&r.attr("name",t.name),t.rx!==void 0&&r.attr("rx",t.rx),t.ry!==void 0&&r.attr("ry",t.ry),t.attrs!==void 0)for(let e in t.attrs)r.attr(e,t.attrs[e]);return t.class!==void 0&&r.attr("class",t.class),r},h=(s,t)=>{let r={x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,stroke:t.stroke,class:"rect"};x(s,r).lower()},y=(s,t)=>{let r=t.text.replace(o," "),e=s.append("text");e.attr("x",t.x),e.attr("y",t.y),e.attr("class","legend"),e.style("text-anchor",t.anchor),t.class!==void 0&&e.attr("class",t.class);let n=e.append("tspan");return n.attr("x",t.x+t.textMargin*2),n.text(r),e},m=(s,t,r,e)=>{let n=s.append("image");n.attr("x",t),n.attr("y",r);let a=(0,i.sanitizeUrl)(e);n.attr("xlink:href",a)},p=(s,t,r,e)=>{let n=s.append("use");n.attr("x",t),n.attr("y",r);let a=(0,i.sanitizeUrl)(e);n.attr("xlink:href",`#${a}`)},g=()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),f=()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0});export{x as a,h as b,y as c,m as d,p as e,g as f,f as g}; 2 | //# sourceMappingURL=chunk-M7PQX5EB.min.js.map 3 | -------------------------------------------------------------------------------- /docs/styles/main.css: -------------------------------------------------------------------------------- 1 | .inheritance .level6::before, 2 | .inheritance .level7::before, 3 | .inheritance .level8::before, 4 | .inheritance .level9::before, 5 | .inheritance .level10::before, 6 | .inheritance .level11::before, 7 | .inheritance .level12::before, 8 | .inheritance .level13::before, 9 | .inheritance .level14::before, 10 | .inheritance .level15::before { 11 | content: '↳'; 12 | margin-right: 5px; 13 | } 14 | 15 | .inheritance .level6 { 16 | margin-left: 6em; 17 | } 18 | 19 | .inheritance .level7 { 20 | margin-left: 7em; 21 | } 22 | 23 | .inheritance .level8 { 24 | margin-left: 8em; 25 | } 26 | 27 | .inheritance .level9 { 28 | margin-left: 9em; 29 | } 30 | 31 | .inheritance .level10 { 32 | margin-left: 10em; 33 | } 34 | 35 | .inheritance .level11 { 36 | margin-left: 11em; 37 | } 38 | 39 | .inheritance .level12 { 40 | margin-left: 12em; 41 | } 42 | 43 | .inheritance .level13 { 44 | margin-left: 13em; 45 | } 46 | 47 | .inheritance .level14 { 48 | margin-left: 14em; 49 | } 50 | 51 | .inheritance .level15 { 52 | margin-left: 15em; 53 | } 54 | 55 | .implements, [classs="implements"] { 56 | display: none; 57 | } 58 | 59 | .inheritedMembers { 60 | display: none; 61 | } 62 | 63 | .note { 64 | background: aliceblue; 65 | padding: 8px; 66 | } 67 | 68 | p.note:before { 69 | content: "Note: "; 70 | font-weight: bold; 71 | } 72 | 73 | section .note { 74 | display: none; 75 | } -------------------------------------------------------------------------------- /docs/public/classDiagram-LNE6IOMH-VZ67B4ZP.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/classDiagram-LNE6IOMH.mjs"], 4 | "sourcesContent": ["import {\n classDb_default,\n classDiagram_default,\n classRenderer_v3_unified_default,\n styles_default\n} from \"./chunk-T2TOU4HS.mjs\";\nimport \"./chunk-5HRBRIJM.mjs\";\nimport \"./chunk-BO7VGL7K.mjs\";\nimport \"./chunk-66SQ7PYY.mjs\";\nimport \"./chunk-7NZE2EM7.mjs\";\nimport \"./chunk-OPO4IU42.mjs\";\nimport \"./chunk-3JNJP5BE.mjs\";\nimport \"./chunk-3X56UNUX.mjs\";\nimport \"./chunk-6JOS74DS.mjs\";\nimport \"./chunk-7DKRZKHE.mjs\";\nimport {\n __name\n} from \"./chunk-6DBFFHIP.mjs\";\n\n// src/diagrams/class/classDiagram.ts\nvar diagram = {\n parser: classDiagram_default,\n db: classDb_default,\n renderer: classRenderer_v3_unified_default,\n styles: styles_default,\n init: /* @__PURE__ */ __name((cnf) => {\n if (!cnf.class) {\n cnf.class = {};\n }\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n classDb_default.clear();\n }, \"init\")\n};\nexport {\n diagram\n};\n"], 5 | "mappings": "6eAoBA,IAAIA,EAAU,CACZ,OAAQC,EACR,GAAIC,EACJ,SAAUC,EACV,OAAQC,EACR,KAAsBC,EAAQC,GAAQ,CAC/BA,EAAI,QACPA,EAAI,MAAQ,CAAC,GAEfA,EAAI,MAAM,oBAAsBA,EAAI,oBACpCJ,EAAgB,MAAM,CACxB,EAAG,MAAM,CACX", 6 | "names": ["diagram", "classDiagram_default", "classDb_default", "classRenderer_v3_unified_default", "styles_default", "__name", "cnf"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/classDiagram-v2-MQ7JQ4JX-4JTAVB6L.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/classDiagram-v2-MQ7JQ4JX.mjs"], 4 | "sourcesContent": ["import {\n classDb_default,\n classDiagram_default,\n classRenderer_v3_unified_default,\n styles_default\n} from \"./chunk-T2TOU4HS.mjs\";\nimport \"./chunk-5HRBRIJM.mjs\";\nimport \"./chunk-BO7VGL7K.mjs\";\nimport \"./chunk-66SQ7PYY.mjs\";\nimport \"./chunk-7NZE2EM7.mjs\";\nimport \"./chunk-OPO4IU42.mjs\";\nimport \"./chunk-3JNJP5BE.mjs\";\nimport \"./chunk-3X56UNUX.mjs\";\nimport \"./chunk-6JOS74DS.mjs\";\nimport \"./chunk-7DKRZKHE.mjs\";\nimport {\n __name\n} from \"./chunk-6DBFFHIP.mjs\";\n\n// src/diagrams/class/classDiagram-v2.ts\nvar diagram = {\n parser: classDiagram_default,\n db: classDb_default,\n renderer: classRenderer_v3_unified_default,\n styles: styles_default,\n init: /* @__PURE__ */ __name((cnf) => {\n if (!cnf.class) {\n cnf.class = {};\n }\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n classDb_default.clear();\n }, \"init\")\n};\nexport {\n diagram\n};\n"], 5 | "mappings": "6eAoBA,IAAIA,EAAU,CACZ,OAAQC,EACR,GAAIC,EACJ,SAAUC,EACV,OAAQC,EACR,KAAsBC,EAAQC,GAAQ,CAC/BA,EAAI,QACPA,EAAI,MAAQ,CAAC,GAEfA,EAAI,MAAM,oBAAsBA,EAAI,oBACpCJ,EAAgB,MAAM,CACxB,EAAG,MAAM,CACX", 6 | "names": ["diagram", "classDiagram_default", "classDb_default", "classRenderer_v3_unified_default", "styles_default", "__name", "cnf"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/stateDiagram-v2-4JROLMXI-COTI64PW.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/stateDiagram-v2-4JROLMXI.mjs"], 4 | "sourcesContent": ["import {\n stateDb_default,\n stateDiagram_default,\n stateRenderer_v3_unified_default,\n styles_default\n} from \"./chunk-7U56Z5CX.mjs\";\nimport \"./chunk-5HRBRIJM.mjs\";\nimport \"./chunk-BO7VGL7K.mjs\";\nimport \"./chunk-66SQ7PYY.mjs\";\nimport \"./chunk-7NZE2EM7.mjs\";\nimport \"./chunk-OPO4IU42.mjs\";\nimport \"./chunk-3JNJP5BE.mjs\";\nimport \"./chunk-3X56UNUX.mjs\";\nimport \"./chunk-6JOS74DS.mjs\";\nimport \"./chunk-7DKRZKHE.mjs\";\nimport {\n __name\n} from \"./chunk-6DBFFHIP.mjs\";\n\n// src/diagrams/state/stateDiagram-v2.ts\nvar diagram = {\n parser: stateDiagram_default,\n db: stateDb_default,\n renderer: stateRenderer_v3_unified_default,\n styles: styles_default,\n init: /* @__PURE__ */ __name((cnf) => {\n if (!cnf.state) {\n cnf.state = {};\n }\n cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n stateDb_default.clear();\n }, \"init\")\n};\nexport {\n diagram\n};\n"], 5 | "mappings": "weAoBA,IAAIA,EAAU,CACZ,OAAQC,EACR,GAAIC,EACJ,SAAUC,EACV,OAAQC,EACR,KAAsBC,EAAQC,GAAQ,CAC/BA,EAAI,QACPA,EAAI,MAAQ,CAAC,GAEfA,EAAI,MAAM,oBAAsBA,EAAI,oBACpCJ,EAAgB,MAAM,CACxB,EAAG,MAAM,CACX", 6 | "names": ["diagram", "stateDiagram_default", "stateDb_default", "stateRenderer_v3_unified_default", "styles_default", "__name", "cnf"] 7 | } 8 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelPerformanceTest/VirtualizingWrapPanelPerformanceTest.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net8.0-windows 5 | enable 6 | enable 7 | 8 | false 9 | true 10 | 11 | 12 | 13 | 14 | all 15 | runtime; build; native; contentfiles; analyzers; buildtransitive 16 | 17 | 18 | 19 | 20 | all 21 | runtime; build; native; contentfiles; analyzers; buildtransitive 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /docs/public/lunr.vi-3U4A337N.min.js: -------------------------------------------------------------------------------- 1 | import{a as u}from"./chunk-OSRY5VT3.min.js";var o=u((t,r)=>{(function(e,i){typeof define=="function"&&define.amd?define(i):typeof t=="object"?r.exports=i():i()(e.lunr)})(t,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-z\u0300\u0350\u0301\u0351\u0309\u0323\u0303\u0343\xC2\xE2\xCA\xEA\xD4\xF4\u0102-\u0103\u0110-\u0111\u01A0-\u01A1\u01AF-\u01B0]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("l\xE0 c\xE1i nh\u01B0ng m\xE0".split(" "))}})});export default o(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.vi.js: 5 | (*! 6 | * Lunr languages, `Vietnamese` language 7 | * https://github.com/MihaiValentin/lunr-languages 8 | * 9 | * Copyright 2017, Keerati Thiwanruk 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.vi-3U4A337N.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.vi-QNO46JPR.min.js: -------------------------------------------------------------------------------- 1 | import{b as u}from"./chunk-XUHMPXWX.min.js";var o=u((t,r)=>{(function(e,i){typeof define=="function"&&define.amd?define(i):typeof t=="object"?r.exports=i():i()(e.lunr)})(t,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-z\u0300\u0350\u0301\u0351\u0309\u0323\u0303\u0343\xC2\xE2\xCA\xEA\xD4\xF4\u0102-\u0103\u0110-\u0111\u01A0-\u01A1\u01AF-\u01B0]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("l\xE0 c\xE1i nh\u01B0ng m\xE0".split(" "))}})});export default o(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.vi.js: 5 | (*! 6 | * Lunr languages, `Vietnamese` language 7 | * https://github.com/MihaiValentin/lunr-languages 8 | * 9 | * Copyright 2017, Keerati Thiwanruk 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.vi-QNO46JPR.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.vi-S3VOAA5A.min.js: -------------------------------------------------------------------------------- 1 | import{b as u}from"./chunk-P42HNYSU.min.js";var o=u((t,r)=>{(function(e,i){typeof define=="function"&&define.amd?define(i):typeof t=="object"?r.exports=i():i()(e.lunr)})(t,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-z\u0300\u0350\u0301\u0351\u0309\u0323\u0303\u0343\xC2\xE2\xCA\xEA\xD4\xF4\u0102-\u0103\u0110-\u0111\u01A0-\u01A1\u01AF-\u01B0]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("l\xE0 c\xE1i nh\u01B0ng m\xE0".split(" "))}})});export default o(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.vi.js: 5 | (*! 6 | * Lunr languages, `Vietnamese` language 7 | * https://github.com/MihaiValentin/lunr-languages 8 | * 9 | * Copyright 2017, Keerati Thiwanruk 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.vi-S3VOAA5A.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/chunk-C7DS3QYJ.min.js: -------------------------------------------------------------------------------- 1 | import{a as c}from"./chunk-CM5D5KZN.min.js";import{G as o,h as n}from"./chunk-U3SD26FK.min.js";import{d as x}from"./chunk-OSRY5VT3.min.js";var l=x(c(),1),d=n((a,t)=>{let r=a.append("rect");if(r.attr("x",t.x),r.attr("y",t.y),r.attr("fill",t.fill),r.attr("stroke",t.stroke),r.attr("width",t.width),r.attr("height",t.height),t.name&&r.attr("name",t.name),t.rx&&r.attr("rx",t.rx),t.ry&&r.attr("ry",t.ry),t.attrs!==void 0)for(let e in t.attrs)r.attr(e,t.attrs[e]);return t.class&&r.attr("class",t.class),r},"drawRect"),g=n((a,t)=>{let r={x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,stroke:t.stroke,class:"rect"};d(a,r).lower()},"drawBackgroundRect"),h=n((a,t)=>{let r=t.text.replace(o," "),e=a.append("text");e.attr("x",t.x),e.attr("y",t.y),e.attr("class","legend"),e.style("text-anchor",t.anchor),t.class&&e.attr("class",t.class);let s=e.append("tspan");return s.attr("x",t.x+t.textMargin*2),s.text(r),e},"drawText"),y=n((a,t,r,e)=>{let s=a.append("image");s.attr("x",t),s.attr("y",r);let i=(0,l.sanitizeUrl)(e);s.attr("xlink:href",i)},"drawImage"),p=n((a,t,r,e)=>{let s=a.append("use");s.attr("x",t),s.attr("y",r);let i=(0,l.sanitizeUrl)(e);s.attr("xlink:href",`#${i}`)},"drawEmbeddedImage"),f=n(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),w=n(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj");export{d as a,g as b,h as c,y as d,p as e,f,w as g}; 2 | //# sourceMappingURL=chunk-C7DS3QYJ.min.js.map 3 | -------------------------------------------------------------------------------- /docs/public/lunr.th-LSQ6T65I.min.js: -------------------------------------------------------------------------------- 1 | import{b as h}from"./chunk-P42HNYSU.min.js";var p=h((r,o)=>{(function(e,t){typeof define=="function"&&define.amd?define(t):typeof r=="object"?o.exports=t():t()(e.lunr)})(r,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var t=e.version[0]=="2";e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),t?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[\u0E00-\u0E7F]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var n=e.wordcut;n.init(),e.th.tokenizer=function(i){if(!arguments.length||i==null||i==null)return[];if(Array.isArray(i))return i.map(function(s){return t?new e.Token(s):s});var f=i.toString().replace(/^\s+/,"");return n.cut(f).split("|")}}})});export default p(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.th.js: 5 | (*! 6 | * Lunr languages, `Thai` language 7 | * https://github.com/MihaiValentin/lunr-languages 8 | * 9 | * Copyright 2017, Keerati Thiwanruk 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.th-LSQ6T65I.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.th-O4JBL3IY.min.js: -------------------------------------------------------------------------------- 1 | import{a as h}from"./chunk-OSRY5VT3.min.js";var p=h((r,o)=>{(function(e,t){typeof define=="function"&&define.amd?define(t):typeof r=="object"?o.exports=t():t()(e.lunr)})(r,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var t=e.version[0]=="2";e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),t?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[\u0E00-\u0E7F]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var n=e.wordcut;n.init(),e.th.tokenizer=function(i){if(!arguments.length||i==null||i==null)return[];if(Array.isArray(i))return i.map(function(s){return t?new e.Token(s):s});var f=i.toString().replace(/^\s+/,"");return n.cut(f).split("|")}}})});export default p(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.th.js: 5 | (*! 6 | * Lunr languages, `Thai` language 7 | * https://github.com/MihaiValentin/lunr-languages 8 | * 9 | * Copyright 2017, Keerati Thiwanruk 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.th-O4JBL3IY.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.th-RUK2AEUT.min.js: -------------------------------------------------------------------------------- 1 | import{b as h}from"./chunk-XUHMPXWX.min.js";var p=h((r,o)=>{(function(e,t){typeof define=="function"&&define.amd?define(t):typeof r=="object"?o.exports=t():t()(e.lunr)})(r,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var t=e.version[0]=="2";e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),t?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[\u0E00-\u0E7F]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var n=e.wordcut;n.init(),e.th.tokenizer=function(i){if(!arguments.length||i==null||i==null)return[];if(Array.isArray(i))return i.map(function(s){return t?new e.Token(s):s});var f=i.toString().replace(/^\s+/,"");return n.cut(f).split("|")}}})});export default p(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.th.js: 5 | (*! 6 | * Lunr languages, `Thai` language 7 | * https://github.com/MihaiValentin/lunr-languages 8 | * 9 | * Copyright 2017, Keerati Thiwanruk 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.th-RUK2AEUT.min.js.map 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Nuget](https://img.shields.io/nuget/v/VirtualizingWrapPanel)](https://www.nuget.org/packages/VirtualizingWrapPanel) 2 | [GitHub](https://github.com/sbaeumlisberger/VirtualizingWrapPanel/blob/master/LICENSE) 3 | 4 | ## VirtualizingWrapPanel 5 | 6 | Feature-rich implementation of a [VirtualizingWrapPanel](https://sbaeumlisberger.github.io/VirtualizingWrapPanel/api/WpfToolkit.Controls.VirtualizingWrapPanel.html) control for WPF running .NET Framework 4.6.2+ or .NET 6.0+. The additional [GridView](https://sbaeumlisberger.github.io/VirtualizingWrapPanel/api/WpfToolkit.Controls.GridView.html) control provides a easy to use out-of-the-box experience. 7 | 8 | ### Features 9 | * High performance (tested with up to 1 million items) 10 | * Horizontal and vertical orientation 11 | * Grouping / hierarchical virtualization 12 | * Configurable spacing behaviour and item alignment 13 | * Caching based on pages, items or pixels 14 | * Displaying different sized items 15 | * Recycling or standard virtualization 16 | 17 | ### Resources 18 | * [Getting started](src/VirtualizingWrapPanel/docfx/docs/getting-started.md) 19 | * [Sample Application](SamplesApplication.md) 20 | * [API Documentation](https://sbaeumlisberger.github.io/VirtualizingWrapPanel/api/WpfToolkit.Controls.html) 21 | 22 | ### Contribution 23 | Feel free to open an issue if you have a problem or suggestion. Pull requests are also accepted, but please make sure you open an issue first so that it can be discussed. 24 | To to support the future development of the project you can become a [sponsor](https://github.com/sponsors/sbaeumlisberger) or make a donation via [PayPal](https://www.paypal.com/paypalme/sbaeumlisberger). 25 | -------------------------------------------------------------------------------- /docs/public/chunk-CLIYZZ5Y.min.js: -------------------------------------------------------------------------------- 1 | import{h as x}from"./chunk-U3SD26FK.min.js";var c={aggregation:18,extension:18,composition:18,dependency:6,lollipop:13.5,arrow_point:4};function d(n,r){if(n===void 0||r===void 0)return{angle:0,deltaX:0,deltaY:0};n=t(n),r=t(r);let[s,e]=[n.x,n.y],[a,i]=[r.x,r.y],o=a-s,y=i-e;return{angle:Math.atan(y/o),deltaX:o,deltaY:y}}x(d,"calculateDeltaAndAngle");var t=x(n=>Array.isArray(n)?{x:n[0],y:n[1]}:n,"pointTransformer"),T=x(n=>({x:x(function(r,s,e){let a=0,i=t(e[0]).x=0?1:-1)}else if(s===e.length-1&&Object.hasOwn(c,n.arrowTypeEnd)){let{angle:l,deltaX:g}=d(e[e.length-1],e[e.length-2]);a=c[n.arrowTypeEnd]*Math.cos(l)*(g>=0?1:-1)}let o=Math.abs(t(r).x-t(e[e.length-1]).x),y=Math.abs(t(r).y-t(e[e.length-1]).y),f=Math.abs(t(r).x-t(e[0]).x),w=Math.abs(t(r).y-t(e[0]).y),h=c[n.arrowTypeStart],u=c[n.arrowTypeEnd],p=1;if(o0&&y0&&w=0?1:-1)}else if(s===e.length-1&&Object.hasOwn(c,n.arrowTypeEnd)){let{angle:l,deltaY:g}=d(e[e.length-1],e[e.length-2]);a=c[n.arrowTypeEnd]*Math.abs(Math.sin(l))*(g>=0?1:-1)}let o=Math.abs(t(r).y-t(e[e.length-1]).y),y=Math.abs(t(r).x-t(e[e.length-1]).x),f=Math.abs(t(r).y-t(e[0]).y),w=Math.abs(t(r).x-t(e[0]).x),h=c[n.arrowTypeStart],u=c[n.arrowTypeEnd],p=1;if(o0&&y0&&w 11 | 12 | 13 | 18 | 19 | 20 | 21 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /docs/public/flowDiagram-v2-13329dc7-7HQDDRUE.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/flowDiagram-v2-13329dc7.js"], 4 | "sourcesContent": ["import { p as parser, f as flowDb } from \"./flowDb-c1833063.js\";\nimport { f as flowRendererV2, a as flowStyles } from \"./styles-483fbfea.js\";\nimport { p as setConfig } from \"./mermaid-6dc72991.js\";\nimport \"d3\";\nimport \"dagre-d3-es/src/graphlib/index.js\";\nimport \"./index-01f381cb.js\";\nimport \"dagre-d3-es/src/dagre/index.js\";\nimport \"dagre-d3-es/src/graphlib/json.js\";\nimport \"./edges-066a5561.js\";\nimport \"./createText-ca0c5216.js\";\nimport \"mdast-util-from-markdown\";\nimport \"ts-dedent\";\nimport \"dagre-d3-es/src/dagre-js/label/add-html-label.js\";\nimport \"khroma\";\nimport \"dayjs\";\nimport \"@braintree/sanitize-url\";\nimport \"dompurify\";\nimport \"lodash-es/memoize.js\";\nimport \"lodash-es/merge.js\";\nimport \"stylis\";\nimport \"lodash-es/isEmpty.js\";\nconst diagram = {\n parser,\n db: flowDb,\n renderer: flowRendererV2,\n styles: flowStyles,\n init: (cnf) => {\n if (!cnf.flowchart) {\n cnf.flowchart = {};\n }\n cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n setConfig({ flowchart: { arrowMarkerAbsolute: cnf.arrowMarkerAbsolute } });\n flowRendererV2.setConf(cnf.flowchart);\n flowDb.clear();\n flowDb.setGen(\"gen-2\");\n }\n};\nexport {\n diagram\n};\n"], 5 | "mappings": "oXAcA,IAAAA,EAAO,SACPC,EAAO,SACPC,EAAO,SAKP,IAAMC,EAAU,CACd,OAAAC,EACA,GAAIC,EACJ,SAAUC,EACV,OAAQC,EACR,KAAOC,GAAQ,CACRA,EAAI,YACPA,EAAI,UAAY,CAAC,GAEnBA,EAAI,UAAU,oBAAsBA,EAAI,oBACxCC,EAAU,CAAE,UAAW,CAAE,oBAAqBD,EAAI,mBAAoB,CAAE,CAAC,EACzEF,EAAe,QAAQE,EAAI,SAAS,EACpCH,EAAO,MAAM,EACbA,EAAO,OAAO,OAAO,CACvB,CACF", 6 | "names": ["import_dayjs", "import_sanitize_url", "import_dompurify", "diagram", "parser$1", "flowDb", "flowRendererV2", "flowStyles", "cnf", "setConfig"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/flowDiagram-v2-2f8f667a-WVVXSXHH.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/flowDiagram-v2-2f8f667a.js"], 4 | "sourcesContent": ["import { p as parser, f as flowDb } from \"./flowDb-170db09d.js\";\nimport { f as flowRendererV2, a as flowStyles } from \"./styles-b966c4ae.js\";\nimport { p as setConfig } from \"./mermaid-934d9bea.js\";\nimport \"d3\";\nimport \"dagre-d3-es/src/graphlib/index.js\";\nimport \"./index-67a42d7d.js\";\nimport \"dagre-d3-es/src/dagre/index.js\";\nimport \"dagre-d3-es/src/graphlib/json.js\";\nimport \"./edges-80f1ebb6.js\";\nimport \"./createText-aebacdfe.js\";\nimport \"mdast-util-from-markdown\";\nimport \"ts-dedent\";\nimport \"dagre-d3-es/src/dagre-js/label/add-html-label.js\";\nimport \"khroma\";\nimport \"dayjs\";\nimport \"@braintree/sanitize-url\";\nimport \"dompurify\";\nimport \"lodash-es/memoize.js\";\nimport \"lodash-es/merge.js\";\nimport \"stylis\";\nimport \"lodash-es/isEmpty.js\";\nconst diagram = {\n parser,\n db: flowDb,\n renderer: flowRendererV2,\n styles: flowStyles,\n init: (cnf) => {\n if (!cnf.flowchart) {\n cnf.flowchart = {};\n }\n cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n setConfig({ flowchart: { arrowMarkerAbsolute: cnf.arrowMarkerAbsolute } });\n flowRendererV2.setConf(cnf.flowchart);\n flowDb.clear();\n flowDb.setGen(\"gen-2\");\n }\n};\nexport {\n diagram\n};\n"], 5 | "mappings": "oVAcA,IAAAA,EAAO,SACPC,EAAO,SACPC,EAAO,SAKP,IAAMC,EAAU,CACd,OAAAC,EACA,GAAIC,EACJ,SAAUC,EACV,OAAQC,EACR,KAAOC,GAAQ,CACRA,EAAI,YACPA,EAAI,UAAY,CAAC,GAEnBA,EAAI,UAAU,oBAAsBA,EAAI,oBACxCC,EAAU,CAAE,UAAW,CAAE,oBAAqBD,EAAI,mBAAoB,CAAE,CAAC,EACzEF,EAAe,QAAQE,EAAI,SAAS,EACpCH,EAAO,MAAM,EACbA,EAAO,OAAO,OAAO,CACvB,CACF", 6 | "names": ["import_dayjs", "import_sanitize_url", "import_dompurify", "diagram", "parser$1", "flowDb", "flowRendererV2", "flowStyles", "cnf", "setConfig"] 7 | } 8 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelTest/Tests/RegressionTest.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Windows; 3 | using System.Windows.Controls; 4 | using System.Windows.Data; 5 | using WpfToolkit.Controls; 6 | using Xunit; 7 | 8 | namespace VirtualizingWrapPanelTest.Tests; 9 | 10 | public class RegressionTest 11 | { 12 | 13 | [WpfFact] 14 | public void RemoveVirtualizingWrapPanelFromItemsControlAndRemoveItem() 15 | { 16 | var items = TestUtil.GenerateItems(1000); 17 | var collectionView = CollectionViewSource.GetDefaultView(items); 18 | var itemsControl = TestUtil.CreateListBox(500, 400, collectionView); 19 | var vwp = TestUtil.GetVisualChild(itemsControl)!; 20 | vwp.UpdateLayout(); 21 | TestUtil.AssertItemRealized(vwp, "Item 1"); 22 | 23 | itemsControl.ItemsPanel = null; 24 | items.RemoveAt(0); 25 | vwp.UpdateLayout(); 26 | 27 | // If no exception is thrown, the test passes. 28 | } 29 | 30 | // #87 DivideByZeroException when item width greater than viewport width and cache unit is Item 31 | [WpfTheory] 32 | [InlineData(VirtualizationCacheLengthUnit.Item, 10)] 33 | [InlineData(VirtualizationCacheLengthUnit.Page, 1)] 34 | [InlineData(VirtualizationCacheLengthUnit.Pixel, 100)] 35 | public void ItemWidthGreaterThanViewportWidth(VirtualizationCacheLengthUnit cacheLengthUnit, int cacheLength) 36 | { 37 | var vwp = TestUtil.CreateVirtualizingWrapPanel(500, 400); 38 | VirtualizingPanel.SetCacheLengthUnit(vwp.ItemsControl, cacheLengthUnit); 39 | VirtualizingPanel.SetCacheLength(vwp.ItemsControl, new VirtualizationCacheLength(cacheLength)); 40 | vwp.SetVerticalOffset(1000); 41 | vwp.UpdateLayout(); 42 | 43 | vwp.ItemSize = new Size(vwp.ItemsControl.Width + 100, 100); 44 | vwp.UpdateLayout(); 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /docs/public/chunk-CM5D5KZN.min.js: -------------------------------------------------------------------------------- 1 | import{a as m}from"./chunk-OSRY5VT3.min.js";var R=m(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.BLANK_URL=e.relativeFirstCharacters=e.whitespaceEscapeCharsRegex=e.urlSchemeRegex=e.ctrlCharactersRegex=e.htmlCtrlEntityRegex=e.htmlEntitiesRegex=e.invalidProtocolRegex=void 0;e.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im;e.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g;e.htmlCtrlEntityRegex=/&(newline|tab);/gi;e.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;e.urlSchemeRegex=/^.+(:|:)/gim;e.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g;e.relativeFirstCharacters=[".","/"];e.BLANK_URL="about:blank"});var p=m(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.sanitizeUrl=void 0;var t=R();function d(r){return t.relativeFirstCharacters.indexOf(r[0])>-1}function v(r){var c=r.replace(t.ctrlCharactersRegex,"");return c.replace(t.htmlEntitiesRegex,function(a,i){return String.fromCharCode(i)})}function x(r){return URL.canParse(r)}function g(r){try{return decodeURIComponent(r)}catch{return r}}function C(r){if(!r)return t.BLANK_URL;var c,a=g(r.trim());do a=v(a).replace(t.htmlCtrlEntityRegex,"").replace(t.ctrlCharactersRegex,"").replace(t.whitespaceEscapeCharsRegex,"").trim(),a=g(a),c=a.match(t.ctrlCharactersRegex)||a.match(t.htmlEntitiesRegex)||a.match(t.htmlCtrlEntityRegex)||a.match(t.whitespaceEscapeCharsRegex);while(c&&c.length>0);var i=a;if(!i)return t.BLANK_URL;if(d(i))return i;var h=i.trimStart(),u=h.match(t.urlSchemeRegex);if(!u)return i;var n=u[0].toLowerCase().trim();if(t.invalidProtocolRegex.test(n))return t.BLANK_URL;var o=h.replace(/\\/g,"/");if(n==="mailto:"||n.includes("://"))return o;if(n==="http:"||n==="https:"){if(!x(o))return t.BLANK_URL;var l=new URL(o);return l.protocol=l.protocol.toLowerCase(),l.hostname=l.hostname.toLowerCase(),l.toString()}return o}s.sanitizeUrl=C});export{p as a}; 2 | //# sourceMappingURL=chunk-CM5D5KZN.min.js.map 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/VirtualizingWrapPanel.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net462;net6.0-windows 5 | true 6 | 13.0 7 | enable 8 | 9 | 10 | 11 | VirtualizingWrapPanel 12 | 2.3.2 13 | sbaeumlisberger 14 | sbaeumlisberger 15 | Feature-rich implementation of a VirtualizingWrapPanel for WPF. 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | VirtualizingWrapPanel 26 | 27 | git 28 | https://github.com/sbaeumlisberger/VirtualizingWrapPanel 29 | 30 | https://github.com/sbaeumlisberger/VirtualizingWrapPanel 31 | 32 | MIT 33 | 34 | VirtualizingWrapPanel, VirtualizingPanel, WrapPanel, GridView, Virtualization, WPF, XAML, .NET 35 | 36 | README.md 37 | 38 | 39 | - #89 Re-generate disconnected containers when grouping 40 | - #90 Fix overlapping when grouping 41 | - Remove usage of reflection 42 | 43 | 44 | WpfToolkit.Controls 45 | 46 | 47 | 48 | true 49 | snupkg 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamplesFW/VirtualizingWrapPanelSamplesFW.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | WinExe 4 | net472 5 | 8.0 6 | true 7 | enable 8 | 9 | 10 | 11 | 12 | BoolToVisibilityConverter.cs 13 | 14 | 15 | ColorToBrushConverter.cs 16 | 17 | 18 | MainWindow.xaml.cs 19 | 20 | 21 | MainWindowModel.cs 22 | 23 | 24 | TestItem.cs 25 | 26 | 27 | TestItemSizeProvider.cs 28 | 29 | 30 | 31 | 32 | 33 | 34 | SettingsSingleFileGenerator 35 | Settings.Designer.cs 36 | 37 | 38 | 39 | 40 | 41 | MainWindow.xaml 42 | MSBuild:Compile 43 | Designer 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /docs/api/toc.json: -------------------------------------------------------------------------------- 1 | 2 | {"items":[{"name":"WpfToolkit.Controls","href":"WpfToolkit.Controls.html","topicHref":"WpfToolkit.Controls.html","topicUid":"WpfToolkit.Controls","type":"Namespace","items":[{"name":"GridDetailsView","href":"WpfToolkit.Controls.GridDetailsView.html","topicHref":"WpfToolkit.Controls.GridDetailsView.html","topicUid":"WpfToolkit.Controls.GridDetailsView","type":"Class"},{"name":"GridView","href":"WpfToolkit.Controls.GridView.html","topicHref":"WpfToolkit.Controls.GridView.html","topicUid":"WpfToolkit.Controls.GridView","type":"Class"},{"name":"IItemSizeProvider","href":"WpfToolkit.Controls.IItemSizeProvider.html","topicHref":"WpfToolkit.Controls.IItemSizeProvider.html","topicUid":"WpfToolkit.Controls.IItemSizeProvider","type":"Interface"},{"name":"ItemAlignment","href":"WpfToolkit.Controls.ItemAlignment.html","topicHref":"WpfToolkit.Controls.ItemAlignment.html","topicUid":"WpfToolkit.Controls.ItemAlignment","type":"Enum"},{"name":"SpacingMode","href":"WpfToolkit.Controls.SpacingMode.html","topicHref":"WpfToolkit.Controls.SpacingMode.html","topicUid":"WpfToolkit.Controls.SpacingMode","type":"Enum"},{"name":"VirtualizingItemsControl","href":"WpfToolkit.Controls.VirtualizingItemsControl.html","topicHref":"WpfToolkit.Controls.VirtualizingItemsControl.html","topicUid":"WpfToolkit.Controls.VirtualizingItemsControl","type":"Class"},{"name":"VirtualizingPanelBase","href":"WpfToolkit.Controls.VirtualizingPanelBase.html","topicHref":"WpfToolkit.Controls.VirtualizingPanelBase.html","topicUid":"WpfToolkit.Controls.VirtualizingPanelBase","type":"Class"},{"name":"VirtualizingWrapPanel","href":"WpfToolkit.Controls.VirtualizingWrapPanel.html","topicHref":"WpfToolkit.Controls.VirtualizingWrapPanel.html","topicUid":"WpfToolkit.Controls.VirtualizingWrapPanel","type":"Class"},{"name":"VirtualizingWrapPanelWithItemExpansion","href":"WpfToolkit.Controls.VirtualizingWrapPanelWithItemExpansion.html","topicHref":"WpfToolkit.Controls.VirtualizingWrapPanelWithItemExpansion.html","topicUid":"WpfToolkit.Controls.VirtualizingWrapPanelWithItemExpansion","type":"Class"}]}],"memberLayout":"SamePage","pdf":false} 3 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/VirtualizingItemsControl.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | using System.Windows.Controls; 3 | using System.Windows.Markup; 4 | 5 | namespace WpfToolkit.Controls 6 | { 7 | /// 8 | /// A ItemsControl supporting virtualization. 9 | /// 10 | public class VirtualizingItemsControl : ItemsControl 11 | { 12 | public VirtualizingItemsControl() 13 | { 14 | ItemsPanel = new ItemsPanelTemplate(new FrameworkElementFactory(typeof(VirtualizingStackPanel))); 15 | 16 | string template = @" 17 | 18 | 24 | 27 | 29 | 30 | 31 | "; 32 | Template = (ControlTemplate)XamlReader.Parse(template); 33 | 34 | ScrollViewer.SetCanContentScroll(this, true); 35 | 36 | ScrollViewer.SetVerticalScrollBarVisibility(this, ScrollBarVisibility.Auto); 37 | ScrollViewer.SetHorizontalScrollBarVisibility(this, ScrollBarVisibility.Auto); 38 | 39 | VirtualizingPanel.SetCacheLengthUnit(this, VirtualizationCacheLengthUnit.Page); 40 | VirtualizingPanel.SetCacheLength(this, new VirtualizationCacheLength(1)); 41 | 42 | VirtualizingPanel.SetIsVirtualizingWhenGrouping(this, true); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /docs/public/chunk-33FU46FA.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-4YFB5VUC.mjs"], 4 | "sourcesContent": ["import {\n AbstractMermaidTokenBuilder,\n CommonValueConverter,\n InfoGeneratedModule,\n MermaidGeneratedSharedModule,\n __name\n} from \"./chunk-Y27MQZ3U.mjs\";\n\n// src/language/info/module.ts\nimport {\n EmptyFileSystem,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n inject\n} from \"langium\";\n\n// src/language/info/tokenBuilder.ts\nvar InfoTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"InfoTokenBuilder\");\n }\n constructor() {\n super([\"info\", \"showInfo\"]);\n }\n};\n\n// src/language/info/module.ts\nvar InfoModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new InfoTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new CommonValueConverter(), \"ValueConverter\")\n }\n};\nfunction createInfoServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const Info = inject(\n createDefaultCoreModule({ shared }),\n InfoGeneratedModule,\n InfoModule\n );\n shared.ServiceRegistry.register(Info);\n return { shared, Info };\n}\n__name(createInfoServices, \"createInfoServices\");\n\nexport {\n InfoModule,\n createInfoServices\n};\n"], 5 | "mappings": "2GAiBA,IAAIA,EAAmB,cAAcC,CAA4B,CAC/D,MAAO,CACLC,EAAO,KAAM,kBAAkB,CACjC,CACA,aAAc,CACZ,MAAM,CAAC,OAAQ,UAAU,CAAC,CAC5B,CACF,EAGIC,EAAa,CACf,OAAQ,CACN,aAA8BD,EAAO,IAAM,IAAIF,EAAoB,cAAc,EACjF,eAAgCE,EAAO,IAAM,IAAIE,EAAwB,gBAAgB,CAC3F,CACF,EACA,SAASC,EAAmBC,EAAUC,EAAiB,CACrD,IAAMC,EAASC,EACbC,EAA8BJ,CAAO,EACrCK,CACF,EACMC,EAAOH,EACXI,EAAwB,CAAE,OAAAL,CAAO,CAAC,EAClCM,EACAX,CACF,EACA,OAAAK,EAAO,gBAAgB,SAASI,CAAI,EAC7B,CAAE,OAAAJ,EAAQ,KAAAI,CAAK,CACxB,CACAV,EAAOG,EAAoB,oBAAoB", 6 | "names": ["InfoTokenBuilder", "AbstractMermaidTokenBuilder", "__name", "InfoModule", "CommonValueConverter", "createInfoServices", "context", "EmptyFileSystem", "shared", "inject", "createDefaultSharedCoreModule", "MermaidGeneratedSharedModule", "Info", "createDefaultCoreModule", "InfoGeneratedModule"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/infoDiagram-A4XQUW5V-SKLVFWJI.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/infoDiagram-A4XQUW5V.mjs"], 4 | "sourcesContent": ["import {\n version\n} from \"./chunk-K6PMAZHR.mjs\";\nimport {\n selectSvgElement\n} from \"./chunk-EJ4ZWXGL.mjs\";\nimport {\n __name,\n configureSvgSize,\n log\n} from \"./chunk-6DBFFHIP.mjs\";\n\n// src/diagrams/info/infoParser.ts\nimport { parse } from \"@mermaid-js/parser\";\nvar parser = {\n parse: /* @__PURE__ */ __name(async (input) => {\n const ast = await parse(\"info\", input);\n log.debug(ast);\n }, \"parse\")\n};\n\n// src/diagrams/info/infoDb.ts\nvar DEFAULT_INFO_DB = { version };\nvar getVersion = /* @__PURE__ */ __name(() => DEFAULT_INFO_DB.version, \"getVersion\");\nvar db = {\n getVersion\n};\n\n// src/diagrams/info/infoRenderer.ts\nvar draw = /* @__PURE__ */ __name((text, id, version2) => {\n log.debug(\"rendering info diagram\\n\" + text);\n const svg = selectSvgElement(id);\n configureSvgSize(svg, 100, 400, true);\n const group = svg.append(\"g\");\n group.append(\"text\").attr(\"x\", 100).attr(\"y\", 40).attr(\"class\", \"version\").attr(\"font-size\", 32).style(\"text-anchor\", \"middle\").text(`v${version2}`);\n}, \"draw\");\nvar renderer = { draw };\n\n// src/diagrams/info/infoDiagram.ts\nvar diagram = {\n parser,\n db,\n renderer\n};\nexport {\n diagram\n};\n"], 5 | "mappings": "8fAcA,IAAIA,EAAS,CACX,MAAuBC,EAAO,MAAOC,GAAU,CAC7C,IAAMC,EAAM,MAAMC,EAAM,OAAQF,CAAK,EACrCG,EAAI,MAAMF,CAAG,CACf,EAAG,OAAO,CACZ,EAGIG,EAAkB,CAAE,QAAAC,CAAQ,EAC5BC,EAA6BP,EAAO,IAAMK,EAAgB,QAAS,YAAY,EAC/EG,EAAK,CACP,WAAAD,CACF,EAGIE,EAAuBT,EAAO,CAACU,EAAMC,EAAIC,IAAa,CACxDR,EAAI,MAAM;AAAA,EAA6BM,CAAI,EAC3C,IAAMG,EAAMC,EAAiBH,CAAE,EAC/BI,EAAiBF,EAAK,IAAK,IAAK,EAAI,EACtBA,EAAI,OAAO,GAAG,EACtB,OAAO,MAAM,EAAE,KAAK,IAAK,GAAG,EAAE,KAAK,IAAK,EAAE,EAAE,KAAK,QAAS,SAAS,EAAE,KAAK,YAAa,EAAE,EAAE,MAAM,cAAe,QAAQ,EAAE,KAAK,IAAID,CAAQ,EAAE,CACrJ,EAAG,MAAM,EACLI,EAAW,CAAE,KAAAP,CAAK,EAGlBQ,EAAU,CACZ,OAAAlB,EACA,GAAAS,EACA,SAAAQ,CACF", 6 | "names": ["parser", "__name", "input", "ast", "parse", "log", "DEFAULT_INFO_DB", "version", "getVersion", "db", "draw", "text", "id", "version2", "svg", "selectSvgElement", "configureSvgSize", "renderer", "diagram"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/chunk-OZ2RCKQJ.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-EQFLFMNE.mjs"], 4 | "sourcesContent": ["import {\n AbstractMermaidTokenBuilder,\n CommonValueConverter,\n MermaidGeneratedSharedModule,\n PacketGeneratedModule,\n __name\n} from \"./chunk-Y27MQZ3U.mjs\";\n\n// src/language/packet/module.ts\nimport {\n EmptyFileSystem,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n inject\n} from \"langium\";\n\n// src/language/packet/tokenBuilder.ts\nvar PacketTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"PacketTokenBuilder\");\n }\n constructor() {\n super([\"packet-beta\"]);\n }\n};\n\n// src/language/packet/module.ts\nvar PacketModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new PacketTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new CommonValueConverter(), \"ValueConverter\")\n }\n};\nfunction createPacketServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const Packet = inject(\n createDefaultCoreModule({ shared }),\n PacketGeneratedModule,\n PacketModule\n );\n shared.ServiceRegistry.register(Packet);\n return { shared, Packet };\n}\n__name(createPacketServices, \"createPacketServices\");\n\nexport {\n PacketModule,\n createPacketServices\n};\n"], 5 | "mappings": "2GAiBA,IAAIA,EAAqB,cAAcC,CAA4B,CACjE,MAAO,CACLC,EAAO,KAAM,oBAAoB,CACnC,CACA,aAAc,CACZ,MAAM,CAAC,aAAa,CAAC,CACvB,CACF,EAGIC,EAAe,CACjB,OAAQ,CACN,aAA8BD,EAAO,IAAM,IAAIF,EAAsB,cAAc,EACnF,eAAgCE,EAAO,IAAM,IAAIE,EAAwB,gBAAgB,CAC3F,CACF,EACA,SAASC,EAAqBC,EAAUC,EAAiB,CACvD,IAAMC,EAASC,EACbC,EAA8BJ,CAAO,EACrCK,CACF,EACMC,EAASH,EACbI,EAAwB,CAAE,OAAAL,CAAO,CAAC,EAClCM,EACAX,CACF,EACA,OAAAK,EAAO,gBAAgB,SAASI,CAAM,EAC/B,CAAE,OAAAJ,EAAQ,OAAAI,CAAO,CAC1B,CACAV,EAAOG,EAAsB,sBAAsB", 6 | "names": ["PacketTokenBuilder", "AbstractMermaidTokenBuilder", "__name", "PacketModule", "CommonValueConverter", "createPacketServices", "context", "EmptyFileSystem", "shared", "inject", "createDefaultSharedCoreModule", "MermaidGeneratedSharedModule", "Packet", "createDefaultCoreModule", "PacketGeneratedModule"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/chunk-UEFJDIUO.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-NCMFTTUW.mjs"], 4 | "sourcesContent": ["import {\n AbstractMermaidTokenBuilder,\n CommonValueConverter,\n GitGraphGeneratedModule,\n MermaidGeneratedSharedModule,\n __name\n} from \"./chunk-Y27MQZ3U.mjs\";\n\n// src/language/gitGraph/module.ts\nimport {\n inject,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n EmptyFileSystem\n} from \"langium\";\n\n// src/language/gitGraph/tokenBuilder.ts\nvar GitGraphTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"GitGraphTokenBuilder\");\n }\n constructor() {\n super([\"gitGraph\"]);\n }\n};\n\n// src/language/gitGraph/module.ts\nvar GitGraphModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new GitGraphTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new CommonValueConverter(), \"ValueConverter\")\n }\n};\nfunction createGitGraphServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const GitGraph = inject(\n createDefaultCoreModule({ shared }),\n GitGraphGeneratedModule,\n GitGraphModule\n );\n shared.ServiceRegistry.register(GitGraph);\n return { shared, GitGraph };\n}\n__name(createGitGraphServices, \"createGitGraphServices\");\n\nexport {\n GitGraphModule,\n createGitGraphServices\n};\n"], 5 | "mappings": "2GAiBA,IAAIA,EAAuB,cAAcC,CAA4B,CACnE,MAAO,CACLC,EAAO,KAAM,sBAAsB,CACrC,CACA,aAAc,CACZ,MAAM,CAAC,UAAU,CAAC,CACpB,CACF,EAGIC,EAAiB,CACnB,OAAQ,CACN,aAA8BD,EAAO,IAAM,IAAIF,EAAwB,cAAc,EACrF,eAAgCE,EAAO,IAAM,IAAIE,EAAwB,gBAAgB,CAC3F,CACF,EACA,SAASC,EAAuBC,EAAUC,EAAiB,CACzD,IAAMC,EAASC,EACbC,EAA8BJ,CAAO,EACrCK,CACF,EACMC,EAAWH,EACfI,EAAwB,CAAE,OAAAL,CAAO,CAAC,EAClCM,EACAX,CACF,EACA,OAAAK,EAAO,gBAAgB,SAASI,CAAQ,EACjC,CAAE,OAAAJ,EAAQ,SAAAI,CAAS,CAC5B,CACAV,EAAOG,EAAwB,wBAAwB", 6 | "names": ["GitGraphTokenBuilder", "AbstractMermaidTokenBuilder", "__name", "GitGraphModule", "CommonValueConverter", "createGitGraphServices", "context", "EmptyFileSystem", "shared", "inject", "createDefaultSharedCoreModule", "MermaidGeneratedSharedModule", "GitGraph", "createDefaultCoreModule", "GitGraphGeneratedModule"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/styles/search-worker.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | importScripts('lunr.min.js'); 3 | 4 | var lunrIndex; 5 | 6 | var stopWords = null; 7 | var searchData = {}; 8 | 9 | lunr.tokenizer.separator = /[\s\-\.]+/; 10 | 11 | var stopWordsRequest = new XMLHttpRequest(); 12 | stopWordsRequest.open('GET', '../search-stopwords.json'); 13 | stopWordsRequest.onload = function () { 14 | if (this.status != 200) { 15 | return; 16 | } 17 | stopWords = JSON.parse(this.responseText); 18 | buildIndex(); 19 | } 20 | stopWordsRequest.send(); 21 | 22 | var searchDataRequest = new XMLHttpRequest(); 23 | 24 | searchDataRequest.open('GET', '../index.json'); 25 | searchDataRequest.onload = function () { 26 | if (this.status != 200) { 27 | return; 28 | } 29 | searchData = JSON.parse(this.responseText); 30 | 31 | buildIndex(); 32 | 33 | postMessage({ e: 'index-ready' }); 34 | } 35 | searchDataRequest.send(); 36 | 37 | onmessage = function (oEvent) { 38 | var q = oEvent.data.q; 39 | var hits = lunrIndex.search(q); 40 | var results = []; 41 | hits.forEach(function (hit) { 42 | var item = searchData[hit.ref]; 43 | results.push({ 'href': item.href, 'title': item.title, 'keywords': item.keywords }); 44 | }); 45 | postMessage({ e: 'query-ready', q: q, d: results }); 46 | } 47 | 48 | function buildIndex() { 49 | if (stopWords !== null && !isEmpty(searchData)) { 50 | lunrIndex = lunr(function () { 51 | this.pipeline.remove(lunr.stopWordFilter); 52 | this.ref('href'); 53 | this.field('title', { boost: 50 }); 54 | this.field('keywords', { boost: 20 }); 55 | 56 | for (var prop in searchData) { 57 | if (searchData.hasOwnProperty(prop)) { 58 | this.add(searchData[prop]); 59 | } 60 | } 61 | 62 | var docfxStopWordFilter = lunr.generateStopWordFilter(stopWords); 63 | lunr.Pipeline.registerFunction(docfxStopWordFilter, 'docfxStopWordFilter'); 64 | this.pipeline.add(docfxStopWordFilter); 65 | this.searchPipeline.add(docfxStopWordFilter); 66 | }); 67 | } 68 | } 69 | 70 | function isEmpty(obj) { 71 | if(!obj) return true; 72 | 73 | for (var prop in obj) { 74 | if (obj.hasOwnProperty(prop)) 75 | return false; 76 | } 77 | 78 | return true; 79 | } 80 | })(); 81 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelTest/Tests/GroupingTest_ScrollIntoView_ItemAfterViewportAndCache_DifferentGroupSizes.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Windows; 3 | using System.Windows.Controls; 4 | using System.Windows.Data; 5 | using Xunit; 6 | 7 | namespace VirtualizingWrapPanelTest.Tests; 8 | 9 | public class GroupingTest_ScrollIntoView_ItemAfterViewportAndCache_DifferentGroupSizes 10 | { 11 | private const int ViewportWidth = 500; 12 | 13 | private const int ViewportHeight = 400; 14 | 15 | private const int HeaderHeight = 20; 16 | 17 | private const int Margin = 5; 18 | 19 | private readonly ListBox itemsControl; 20 | 21 | private readonly VirtualizingStackPanel vsp; 22 | 23 | public GroupingTest_ScrollIntoView_ItemAfterViewportAndCache_DifferentGroupSizes() 24 | { 25 | itemsControl = Setup(TestUtil.GenerateItemsWithRandomGroupSizes(1000)); 26 | vsp = TestUtil.GetVisualChild(itemsControl)!; 27 | } 28 | 29 | private static ListBox Setup(ObservableCollection items) 30 | { 31 | var collectionView = CollectionViewSource.GetDefaultView(items); 32 | collectionView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(TestItem.Group))); 33 | var itemsControl = TestUtil.CreateListBox(ViewportWidth + Margin + 2 /*Padding*/, ViewportHeight + 2 /*Padding*/, collectionView); 34 | itemsControl.GroupStyle.Add(new GroupStyle() { HeaderTemplate = TestUtil.CreateDefaultGroupHeaderTemplate(HeaderHeight) }); 35 | VirtualizingPanel.SetIsVirtualizingWhenGrouping(itemsControl, true); 36 | return itemsControl; 37 | } 38 | 39 | [UITheory] 40 | [InlineData(VirtualizationMode.Standard)] 41 | [InlineData(VirtualizationMode.Recycling)] 42 | public void ScrollIntoView_ItemAfterViewportAndCache_DifferentGroupSizes(VirtualizationMode virtualizationMode) 43 | { 44 | VirtualizingPanel.SetVirtualizationMode(itemsControl, virtualizationMode); 45 | itemsControl.UpdateLayout(); 46 | 47 | itemsControl.ScrollIntoView(itemsControl.Items[549]); // Item 550 48 | itemsControl.UpdateLayout(); 49 | 50 | var itemContainer = TestUtil.AssertItemRealized(vsp, "Item 550"); 51 | var position = itemContainer.TranslatePoint(new Point(0, 0), vsp); 52 | Assert.Equal(ViewportHeight - TestUtil.DefaultItemHeight, position.Y); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /docs/public/lunr.hy-E2P7YR63.min.js: -------------------------------------------------------------------------------- 1 | import{b as o}from"./chunk-XUHMPXWX.min.js";var s=o((i,r)=>{(function(e,t){typeof define=="function"&&define.amd?define(t):typeof i=="object"?r.exports=t():t()(e.lunr)})(i,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z\u0530-\u058F\uFB00-\uFB4F]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("\u0564\u0578\u0582 \u0587 \u0565\u0584 \u0567\u056B\u0580 \u0567\u056B\u0584 \u0570\u0565\u057F\u0578 \u0576\u0561\u0587 \u0576\u0580\u0561\u0576\u0584 \u0578\u0580\u0568 \u057E\u0580\u0561 \u0567 \u0578\u0580 \u057A\u056B\u057F\u056B \u0565\u0576 \u0561\u0575\u057D \u0574\u0565\u057B \u0576 \u056B\u0580 \u0578\u0582 \u056B \u0561\u0575\u0564 \u0578\u0580\u0578\u0576\u0584 \u0561\u0575\u0576 \u056F\u0561\u0574 \u0567\u0580 \u0574\u056B \u0565\u057D \u0570\u0561\u0574\u0561\u0580 \u0561\u0575\u056C \u056B\u057D\u056F \u0567\u056B\u0576 \u0565\u0576\u0584 \u0570\u0565\u057F \u056B\u0576 \u0569 \u0567\u056B\u0576\u0584 \u0574\u0565\u0576\u0584 \u0576\u0580\u0561 \u0576\u0561 \u0564\u0578\u0582\u0584 \u0565\u0574 \u0567\u056B \u0568\u057D\u057F \u0578\u0580\u057A\u0565\u057D \u0578\u0582\u0574".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(t){return typeof t.update=="function"?t.update(function(n){return n}):t}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}})});export default s(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.hy.js: 5 | (*! 6 | * Lunr languages, `Armenian` language 7 | * https://github.com/turbobit/lunr-languages 8 | * 9 | * Copyright 2021, Manikandan Venkatasubban 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.hy-E2P7YR63.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.hy-FFQJAR7M.min.js: -------------------------------------------------------------------------------- 1 | import{a as o}from"./chunk-OSRY5VT3.min.js";var s=o((i,r)=>{(function(e,t){typeof define=="function"&&define.amd?define(t):typeof i=="object"?r.exports=t():t()(e.lunr)})(i,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z\u0530-\u058F\uFB00-\uFB4F]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("\u0564\u0578\u0582 \u0587 \u0565\u0584 \u0567\u056B\u0580 \u0567\u056B\u0584 \u0570\u0565\u057F\u0578 \u0576\u0561\u0587 \u0576\u0580\u0561\u0576\u0584 \u0578\u0580\u0568 \u057E\u0580\u0561 \u0567 \u0578\u0580 \u057A\u056B\u057F\u056B \u0565\u0576 \u0561\u0575\u057D \u0574\u0565\u057B \u0576 \u056B\u0580 \u0578\u0582 \u056B \u0561\u0575\u0564 \u0578\u0580\u0578\u0576\u0584 \u0561\u0575\u0576 \u056F\u0561\u0574 \u0567\u0580 \u0574\u056B \u0565\u057D \u0570\u0561\u0574\u0561\u0580 \u0561\u0575\u056C \u056B\u057D\u056F \u0567\u056B\u0576 \u0565\u0576\u0584 \u0570\u0565\u057F \u056B\u0576 \u0569 \u0567\u056B\u0576\u0584 \u0574\u0565\u0576\u0584 \u0576\u0580\u0561 \u0576\u0561 \u0564\u0578\u0582\u0584 \u0565\u0574 \u0567\u056B \u0568\u057D\u057F \u0578\u0580\u057A\u0565\u057D \u0578\u0582\u0574".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(t){return typeof t.update=="function"?t.update(function(n){return n}):t}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}})});export default s(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.hy.js: 5 | (*! 6 | * Lunr languages, `Armenian` language 7 | * https://github.com/turbobit/lunr-languages 8 | * 9 | * Copyright 2021, Manikandan Venkatasubban 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.hy-FFQJAR7M.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.hy-XFQCAWFO.min.js: -------------------------------------------------------------------------------- 1 | import{b as o}from"./chunk-P42HNYSU.min.js";var s=o((i,r)=>{(function(e,t){typeof define=="function"&&define.amd?define(t):typeof i=="object"?r.exports=t():t()(e.lunr)})(i,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z\u0530-\u058F\uFB00-\uFB4F]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("\u0564\u0578\u0582 \u0587 \u0565\u0584 \u0567\u056B\u0580 \u0567\u056B\u0584 \u0570\u0565\u057F\u0578 \u0576\u0561\u0587 \u0576\u0580\u0561\u0576\u0584 \u0578\u0580\u0568 \u057E\u0580\u0561 \u0567 \u0578\u0580 \u057A\u056B\u057F\u056B \u0565\u0576 \u0561\u0575\u057D \u0574\u0565\u057B \u0576 \u056B\u0580 \u0578\u0582 \u056B \u0561\u0575\u0564 \u0578\u0580\u0578\u0576\u0584 \u0561\u0575\u0576 \u056F\u0561\u0574 \u0567\u0580 \u0574\u056B \u0565\u057D \u0570\u0561\u0574\u0561\u0580 \u0561\u0575\u056C \u056B\u057D\u056F \u0567\u056B\u0576 \u0565\u0576\u0584 \u0570\u0565\u057F \u056B\u0576 \u0569 \u0567\u056B\u0576\u0584 \u0574\u0565\u0576\u0584 \u0576\u0580\u0561 \u0576\u0561 \u0564\u0578\u0582\u0584 \u0565\u0574 \u0567\u056B \u0568\u057D\u057F \u0578\u0580\u057A\u0565\u057D \u0578\u0582\u0574".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(t){return typeof t.update=="function"?t.update(function(n){return n}):t}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}})});export default s(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.hy.js: 5 | (*! 6 | * Lunr languages, `Armenian` language 7 | * https://github.com/turbobit/lunr-languages 8 | * 9 | * Copyright 2021, Manikandan Venkatasubban 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.hy-XFQCAWFO.min.js.map 23 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamples/TestItem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | using System.Threading.Tasks; 4 | using System.Windows; 5 | using System.Windows.Media; 6 | 7 | namespace VirtualizingWrapPanelSamples 8 | { 9 | public class TestItem : INotifyPropertyChanged 10 | { 11 | private static readonly int MinWidth = 100; 12 | private static readonly int MaxWidth = 200; 13 | private static readonly int MinHeight = 80; 14 | private static readonly int MaxHeight = 160; 15 | 16 | public event PropertyChangedEventHandler? PropertyChanged; 17 | 18 | public int Group { get; } 19 | 20 | public int Number { get; } 21 | 22 | public Color Background 23 | { 24 | get 25 | { 26 | if (background == default) 27 | { 28 | byte[] randomBytes = new byte[3]; 29 | Random.NextBytes(randomBytes); 30 | background = Color.FromRgb(randomBytes[0], randomBytes[1], randomBytes[2]); 31 | } 32 | return background; 33 | } 34 | } 35 | 36 | public Size Size { get; } 37 | 38 | public Size SizeLazy 39 | { 40 | get 41 | { 42 | if (sizeLazy == Size.Empty) 43 | { 44 | Task.Delay(1000).ContinueWith((_) => 45 | { 46 | sizeLazy = Size; 47 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SizeLazy))); 48 | }); 49 | return new Size(MinWidth, MinHeight); 50 | } 51 | return sizeLazy; 52 | } 53 | } 54 | 55 | public DateTime CurrentDateTime => DateTime.Now; 56 | 57 | private static readonly Random Random = new Random(); 58 | 59 | private Size sizeLazy = Size.Empty; 60 | 61 | private Color background = default; 62 | 63 | public TestItem(int group, int number) 64 | { 65 | Group = group; 66 | Number = number; 67 | var width = Random.Next(MinWidth, MaxWidth); 68 | var height = Random.Next(MinHeight, MaxHeight); 69 | Size = new Size(width, height); 70 | } 71 | 72 | public void Reset() 73 | { 74 | sizeLazy = Size.Empty; 75 | } 76 | 77 | override public string ToString() 78 | { 79 | return $"TestItem({Number})"; 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelTest/Tests/ResizeTest.cs: -------------------------------------------------------------------------------- 1 | using WpfToolkit.Controls; 2 | using Xunit; 3 | using Assert = Xunit.Assert; 4 | 5 | namespace VirtualizingWrapPanelTest.Tests; 6 | 7 | public class ResizeTest 8 | { 9 | private VirtualizingWrapPanel vwp = TestUtil.CreateVirtualizingWrapPanel(500, 400); 10 | 11 | [UIFact] 12 | public void IncreaseWidth() 13 | { 14 | vwp.ItemsControl.Width = 600; 15 | vwp.UpdateLayout(); 16 | 17 | Assert.Equal(600, vwp.ExtentWidth); 18 | Assert.Equal(16_700, vwp.ExtentHeight); 19 | 20 | Assert.Equal(48, vwp.Children.Count); 21 | TestUtil.AssertItem(vwp, "Item 6", 500, 0); 22 | } 23 | 24 | [UIFact] 25 | public void IncreaseHeight() 26 | { 27 | vwp.ItemsControl.Height = 500; 28 | vwp.UpdateLayout(); 29 | 30 | Assert.Equal(500, vwp.ExtentWidth); 31 | Assert.Equal(20_000, vwp.ExtentHeight); 32 | 33 | Assert.Equal(50, vwp.Children.Count); 34 | TestUtil.AssertItem(vwp, "Item 6", 0, 100); 35 | } 36 | 37 | [UIFact] 38 | public void IncreaseWidthAndHeight() 39 | { 40 | vwp.ItemsControl.Width = 600; 41 | vwp.ItemsControl.Height = 500; 42 | vwp.UpdateLayout(); 43 | 44 | Assert.Equal(600, vwp.ExtentWidth); 45 | Assert.Equal(16_700, vwp.ExtentHeight); 46 | 47 | Assert.Equal(60, vwp.Children.Count); 48 | TestUtil.AssertItem(vwp, "Item 6", 500, 0); 49 | } 50 | 51 | [UIFact] 52 | public void DecreaseWidth() 53 | { 54 | vwp.ItemsControl.Width = 400; 55 | vwp.UpdateLayout(); 56 | 57 | Assert.Equal(400, vwp.ExtentWidth); 58 | Assert.Equal(25_000, vwp.ExtentHeight); 59 | 60 | Assert.Equal(32, vwp.Children.Count); 61 | TestUtil.AssertItem(vwp, "Item 6", 100, 100); 62 | } 63 | 64 | [UIFact] 65 | public void DecreaseHeight() 66 | { 67 | vwp.ItemsControl.Height = 300; 68 | vwp.UpdateLayout(); 69 | 70 | Assert.Equal(500, vwp.ExtentWidth); 71 | Assert.Equal(20_000, vwp.ExtentHeight); 72 | 73 | Assert.Equal(30, vwp.Children.Count); 74 | TestUtil.AssertItem(vwp, "Item 6", 0, 100); 75 | } 76 | 77 | [UIFact] 78 | public void DecreaseWidthAndHeight() 79 | { 80 | vwp.ItemsControl.Width = 400; 81 | vwp.ItemsControl.Height = 300; 82 | vwp.UpdateLayout(); 83 | 84 | Assert.Equal(400, vwp.ExtentWidth); 85 | Assert.Equal(25_000, vwp.ExtentHeight); 86 | 87 | Assert.Equal(24, vwp.Children.Count); 88 | TestUtil.AssertItem(vwp, "Item 6", 100, 100); 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /docs/public/chunk-PDS7545E.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-BI6EQKOQ.mjs"], 4 | "sourcesContent": ["import {\n AbstractMermaidTokenBuilder,\n AbstractMermaidValueConverter,\n MermaidGeneratedSharedModule,\n PieGeneratedModule,\n __name\n} from \"./chunk-Y27MQZ3U.mjs\";\n\n// src/language/pie/module.ts\nimport {\n EmptyFileSystem,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n inject\n} from \"langium\";\n\n// src/language/pie/tokenBuilder.ts\nvar PieTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"PieTokenBuilder\");\n }\n constructor() {\n super([\"pie\", \"showData\"]);\n }\n};\n\n// src/language/pie/valueConverter.ts\nvar PieValueConverter = class extends AbstractMermaidValueConverter {\n static {\n __name(this, \"PieValueConverter\");\n }\n runCustomConverter(rule, input, _cstNode) {\n if (rule.name !== \"PIE_SECTION_LABEL\") {\n return void 0;\n }\n return input.replace(/\"/g, \"\").trim();\n }\n};\n\n// src/language/pie/module.ts\nvar PieModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new PieTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new PieValueConverter(), \"ValueConverter\")\n }\n};\nfunction createPieServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const Pie = inject(\n createDefaultCoreModule({ shared }),\n PieGeneratedModule,\n PieModule\n );\n shared.ServiceRegistry.register(Pie);\n return { shared, Pie };\n}\n__name(createPieServices, \"createPieServices\");\n\nexport {\n PieModule,\n createPieServices\n};\n"], 5 | "mappings": "2GAiBA,IAAIA,EAAkB,cAAcC,CAA4B,CAC9D,MAAO,CACLC,EAAO,KAAM,iBAAiB,CAChC,CACA,aAAc,CACZ,MAAM,CAAC,MAAO,UAAU,CAAC,CAC3B,CACF,EAGIC,EAAoB,cAAcC,CAA8B,CAClE,MAAO,CACLF,EAAO,KAAM,mBAAmB,CAClC,CACA,mBAAmBG,EAAMC,EAAOC,EAAU,CACxC,GAAIF,EAAK,OAAS,oBAGlB,OAAOC,EAAM,QAAQ,KAAM,EAAE,EAAE,KAAK,CACtC,CACF,EAGIE,EAAY,CACd,OAAQ,CACN,aAA8BN,EAAO,IAAM,IAAIF,EAAmB,cAAc,EAChF,eAAgCE,EAAO,IAAM,IAAIC,EAAqB,gBAAgB,CACxF,CACF,EACA,SAASM,EAAkBC,EAAUC,EAAiB,CACpD,IAAMC,EAASC,EACbC,EAA8BJ,CAAO,EACrCK,CACF,EACMC,EAAMH,EACVI,EAAwB,CAAE,OAAAL,CAAO,CAAC,EAClCM,EACAV,CACF,EACA,OAAAI,EAAO,gBAAgB,SAASI,CAAG,EAC5B,CAAE,OAAAJ,EAAQ,IAAAI,CAAI,CACvB,CACAd,EAAOO,EAAmB,mBAAmB", 6 | "names": ["PieTokenBuilder", "AbstractMermaidTokenBuilder", "__name", "PieValueConverter", "AbstractMermaidValueConverter", "rule", "input", "_cstNode", "PieModule", "createPieServices", "context", "EmptyFileSystem", "shared", "inject", "createDefaultSharedCoreModule", "MermaidGeneratedSharedModule", "Pie", "createDefaultCoreModule", "PieGeneratedModule"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/api/toc.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 | 7 | 8 | 9 |
10 |
11 |
12 |
13 | 14 | 50 |
51 |
52 |
53 |
54 | -------------------------------------------------------------------------------- /docs/public/chunk-ISDTAGDN.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/chunk-5HRBRIJM.mjs"], 4 | "sourcesContent": ["import {\n __name,\n configureSvgSize,\n log\n} from \"./chunk-6DBFFHIP.mjs\";\n\n// src/rendering-util/insertElementsForSize.js\nimport { select } from \"d3\";\nvar getDiagramElement = /* @__PURE__ */ __name((id, securityLevel) => {\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? select(sandboxElement.nodes()[0].contentDocument.body) : select(\"body\");\n const svg = root.select(`[id=\"${id}\"]`);\n return svg;\n}, \"getDiagramElement\");\n\n// src/rendering-util/setupViewPortForSVG.ts\nvar setupViewPortForSVG = /* @__PURE__ */ __name((svg, padding, cssDiagram, useMaxWidth) => {\n svg.attr(\"class\", cssDiagram);\n const { width, height, x, y } = calculateDimensionsWithPadding(svg, padding);\n configureSvgSize(svg, height, width, useMaxWidth);\n const viewBox = createViewBox(x, y, width, height, padding);\n svg.attr(\"viewBox\", viewBox);\n log.debug(`viewBox configured: ${viewBox} with padding: ${padding}`);\n}, \"setupViewPortForSVG\");\nvar calculateDimensionsWithPadding = /* @__PURE__ */ __name((svg, padding) => {\n const bounds = svg.node()?.getBBox() || { width: 0, height: 0, x: 0, y: 0 };\n return {\n width: bounds.width + padding * 2,\n height: bounds.height + padding * 2,\n x: bounds.x,\n y: bounds.y\n };\n}, \"calculateDimensionsWithPadding\");\nvar createViewBox = /* @__PURE__ */ __name((x, y, width, height, padding) => {\n return `${x - padding} ${y - padding} ${width} ${height}`;\n}, \"createViewBox\");\n\nexport {\n getDiagramElement,\n setupViewPortForSVG\n};\n"], 5 | "mappings": "kEAQA,IAAIA,EAAoCC,EAAO,CAACC,EAAIC,IAAkB,CACpE,IAAIC,EACJ,OAAID,IAAkB,YACpBC,EAAiBC,EAAO,KAAOH,CAAE,IAEtBC,IAAkB,UAAYE,EAAOD,EAAe,MAAM,EAAE,CAAC,EAAE,gBAAgB,IAAI,EAAIC,EAAO,MAAM,GAChG,OAAO,QAAQH,CAAE,IAAI,CAExC,EAAG,mBAAmB,EAGlBI,EAAsCL,EAAO,CAACM,EAAKC,EAASC,EAAYC,IAAgB,CAC1FH,EAAI,KAAK,QAASE,CAAU,EAC5B,GAAM,CAAE,MAAAE,EAAO,OAAAC,EAAQ,EAAAC,EAAG,EAAAC,CAAE,EAAIC,EAA+BR,EAAKC,CAAO,EAC3EQ,EAAiBT,EAAKK,EAAQD,EAAOD,CAAW,EAChD,IAAMO,EAAUC,EAAcL,EAAGC,EAAGH,EAAOC,EAAQJ,CAAO,EAC1DD,EAAI,KAAK,UAAWU,CAAO,EAC3BE,EAAI,MAAM,uBAAuBF,CAAO,kBAAkBT,CAAO,EAAE,CACrE,EAAG,qBAAqB,EACpBO,EAAiDd,EAAO,CAACM,EAAKC,IAAY,CAC5E,IAAMY,EAASb,EAAI,KAAK,GAAG,QAAQ,GAAK,CAAE,MAAO,EAAG,OAAQ,EAAG,EAAG,EAAG,EAAG,CAAE,EAC1E,MAAO,CACL,MAAOa,EAAO,MAAQZ,EAAU,EAChC,OAAQY,EAAO,OAASZ,EAAU,EAClC,EAAGY,EAAO,EACV,EAAGA,EAAO,CACZ,CACF,EAAG,gCAAgC,EAC/BF,EAAgCjB,EAAO,CAACY,EAAGC,EAAGH,EAAOC,EAAQJ,IACxD,GAAGK,EAAIL,CAAO,IAAIM,EAAIN,CAAO,IAAIG,CAAK,IAAIC,CAAM,GACtD,eAAe", 6 | "names": ["getDiagramElement", "__name", "id", "securityLevel", "sandboxElement", "select_default", "setupViewPortForSVG", "svg", "padding", "cssDiagram", "useMaxWidth", "width", "height", "x", "y", "calculateDimensionsWithPadding", "configureSvgSize", "viewBox", "createViewBox", "log", "bounds"] 7 | } 8 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelTest/Tests/CacheTest.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Controls; 2 | using WpfToolkit.Controls; 3 | using Xunit; 4 | using Assert = Xunit.Assert; 5 | 6 | namespace VirtualizingWrapPanelTest.Tests; 7 | 8 | public class CacheTest 9 | { 10 | private VirtualizingWrapPanel vwp = TestUtil.CreateVirtualizingWrapPanel(500, 400); 11 | 12 | [UITheory] 13 | [InlineData(0, 20)] 14 | [InlineData(500, 20)] 15 | [InlineData(550, 25)] // row partial visible 16 | public void NoCache(double offset, int expectedChildCount) 17 | { 18 | VirtualizingPanel.SetCacheLength(vwp.ItemsControl, new VirtualizationCacheLength(0)); 19 | vwp.SetVerticalOffset(offset); 20 | 21 | vwp.UpdateLayout(); 22 | 23 | Assert.Equal(expectedChildCount, vwp.Children.Count); 24 | } 25 | 26 | [UITheory] 27 | [InlineData(0, 60)] 28 | [InlineData(1000, 100)] 29 | [InlineData(1050, 105)] // row partial visible 30 | public void CacheUnitPage(double offset, int expectedChildCount) 31 | { 32 | VirtualizingPanel.SetCacheLength(vwp.ItemsControl, new VirtualizationCacheLength(2)); 33 | vwp.SetVerticalOffset(offset); 34 | 35 | vwp.UpdateLayout(); 36 | 37 | Assert.Equal(expectedChildCount, vwp.Children.Count); 38 | } 39 | 40 | [UITheory] 41 | [InlineData(0, 22)] 42 | [InlineData(500, 24)] 43 | [InlineData(550, 29)] // row partial visible 44 | public void CacheUnitItem(double offset, int expectedChildCount) 45 | { 46 | VirtualizingPanel.SetCacheLength(vwp.ItemsControl, new VirtualizationCacheLength(2)); 47 | VirtualizingPanel.SetCacheLengthUnit(vwp.ItemsControl, VirtualizationCacheLengthUnit.Item); 48 | vwp.SetVerticalOffset(offset); 49 | 50 | vwp.UpdateLayout(); 51 | 52 | Assert.Equal(expectedChildCount, vwp.Children.Count); 53 | } 54 | 55 | [UIFact] 56 | public void CacheUnitItem_DifferentLengths() 57 | { 58 | VirtualizingPanel.SetCacheLength(vwp.ItemsControl, new VirtualizationCacheLength(1, 2)); 59 | VirtualizingPanel.SetCacheLengthUnit(vwp.ItemsControl, VirtualizationCacheLengthUnit.Item); 60 | vwp.SetVerticalOffset(500); 61 | 62 | vwp.UpdateLayout(); 63 | 64 | Assert.Equal(23, vwp.Children.Count); 65 | } 66 | 67 | [UITheory] 68 | [InlineData(0, 150, 30)] 69 | [InlineData(50, 150, 30)] 70 | [InlineData(51, 150, 35)] 71 | [InlineData(50, 200, 35)] 72 | [InlineData(500, 150, 40)] 73 | [InlineData(500, 200, 40)] 74 | public void CacheUnitPixel(double offset, int cacheSize, int expectedChildCount) 75 | { 76 | VirtualizingPanel.SetCacheLength(vwp.ItemsControl, new VirtualizationCacheLength(cacheSize)); 77 | VirtualizingPanel.SetCacheLengthUnit(vwp.ItemsControl, VirtualizationCacheLengthUnit.Pixel); 78 | vwp.SetVerticalOffset(offset); 79 | 80 | vwp.UpdateLayout(); 81 | 82 | Assert.Equal(expectedChildCount, vwp.Children.Count); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelSamplesFW/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace VirtualizingWrapPanelSamplesFW.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VirtualizingWrapPanelSamplesFW.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /docs/public/chunk-334IV3XH.min.js: -------------------------------------------------------------------------------- 1 | import{b as k}from"./chunk-P42HNYSU.min.js";var v=k((h,j)=>{(function(e,n){typeof define=="function"&&define.amd?define(n):typeof h=="object"?j.exports=n():n()(e.lunr)})(h,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var n=e.version[0]=="2";e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),n?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var F=new e.TinySegmenter;e.ja.tokenizer=function(s){var t,i,f,o,a,d,g,p,r,c;if(!arguments.length||s==null||s==null)return[];if(Array.isArray(s))return s.map(function(m){return n?new e.Token(m.toLowerCase()):m.toLowerCase()});for(i=s.toString().toLowerCase().replace(/^\s+/,""),t=i.length-1;t>=0;t--)if(/\S/.test(i.charAt(t))){i=i.substring(0,t+1);break}for(a=[],f=i.length,r=0,p=0;r<=f;r++)if(d=i.charAt(r),g=r-p,d.match(/\s/)||r==f){if(g>0)for(o=F.segment(i.slice(p,r)).filter(function(m){return!!m}),c=p,t=0;t{(function(e,n){typeof define=="function"&&define.amd?define(n):typeof h=="object"?j.exports=n():n()(e.lunr)})(h,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var n=e.version[0]=="2";e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),n?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var F=new e.TinySegmenter;e.ja.tokenizer=function(s){var t,i,f,o,a,d,g,p,r,c;if(!arguments.length||s==null||s==null)return[];if(Array.isArray(s))return s.map(function(m){return n?new e.Token(m.toLowerCase()):m.toLowerCase()});for(i=s.toString().toLowerCase().replace(/^\s+/,""),t=i.length-1;t>=0;t--)if(/\S/.test(i.charAt(t))){i=i.substring(0,t+1);break}for(a=[],f=i.length,r=0,p=0;r<=f;r++)if(d=i.charAt(r),g=r-p,d.match(/\s/)||r==f){if(g>0)for(o=F.segment(i.slice(p,r)).filter(function(m){return!!m}),c=p,t=0;t{(function(e,n){typeof define=="function"&&define.amd?define(n):typeof h=="object"?j.exports=n():n()(e.lunr)})(h,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var n=e.version[0]=="2";e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),n?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var F=new e.TinySegmenter;e.ja.tokenizer=function(s){var t,i,f,o,a,d,g,p,r,c;if(!arguments.length||s==null||s==null)return[];if(Array.isArray(s))return s.map(function(m){return n?new e.Token(m.toLowerCase()):m.toLowerCase()});for(i=s.toString().toLowerCase().replace(/^\s+/,""),t=i.length-1;t>=0;t--)if(/\S/.test(i.charAt(t))){i=i.substring(0,t+1);break}for(a=[],f=i.length,r=0,p=0;r<=f;r++)if(d=i.charAt(r),g=r-p,d.match(/\s/)||r==f){if(g>0)for(o=F.segment(i.slice(p,r)).filter(function(m){return!!m}),c=p,t=0;t new ArchitectureTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new ArchitectureValueConverter(), \"ValueConverter\")\n }\n};\nfunction createArchitectureServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const Architecture = inject(\n createDefaultCoreModule({ shared }),\n ArchitectureGeneratedModule,\n ArchitectureModule\n );\n shared.ServiceRegistry.register(Architecture);\n return { shared, Architecture };\n}\n__name(createArchitectureServices, \"createArchitectureServices\");\n\nexport {\n ArchitectureModule,\n createArchitectureServices\n};\n"], 5 | "mappings": "2GAiBA,IAAIA,EAA2B,cAAcC,CAA4B,CACvE,MAAO,CACLC,EAAO,KAAM,0BAA0B,CACzC,CACA,aAAc,CACZ,MAAM,CAAC,cAAc,CAAC,CACxB,CACF,EAGIC,EAA6B,cAAcC,CAA8B,CAC3E,MAAO,CACLF,EAAO,KAAM,4BAA4B,CAC3C,CACA,mBAAmBG,EAAMC,EAAOC,EAAU,CACxC,GAAIF,EAAK,OAAS,YAChB,OAAOC,EAAM,QAAQ,QAAS,EAAE,EAAE,KAAK,EAClC,GAAID,EAAK,OAAS,iBACvB,OAAOC,EAAM,QAAQ,SAAU,EAAE,EAC5B,GAAID,EAAK,OAAS,aACvB,OAAOC,EAAM,QAAQ,SAAU,EAAE,EAAE,KAAK,CAG5C,CACF,EAGIE,EAAqB,CACvB,OAAQ,CACN,aAA8BN,EAAO,IAAM,IAAIF,EAA4B,cAAc,EACzF,eAAgCE,EAAO,IAAM,IAAIC,EAA8B,gBAAgB,CACjG,CACF,EACA,SAASM,EAA2BC,EAAUC,EAAiB,CAC7D,IAAMC,EAASC,EACbC,EAA8BJ,CAAO,EACrCK,CACF,EACMC,EAAeH,EACnBI,EAAwB,CAAE,OAAAL,CAAO,CAAC,EAClCM,EACAV,CACF,EACA,OAAAI,EAAO,gBAAgB,SAASI,CAAY,EACrC,CAAE,OAAAJ,EAAQ,aAAAI,CAAa,CAChC,CACAd,EAAOO,EAA4B,4BAA4B", 6 | "names": ["ArchitectureTokenBuilder", "AbstractMermaidTokenBuilder", "__name", "ArchitectureValueConverter", "AbstractMermaidValueConverter", "rule", "input", "_cstNode", "ArchitectureModule", "createArchitectureServices", "context", "EmptyFileSystem", "shared", "inject", "createDefaultSharedCoreModule", "MermaidGeneratedSharedModule", "Architecture", "createDefaultCoreModule", "ArchitectureGeneratedModule"] 7 | } 8 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelTest/Tests/GroupingTest_ItemsDoNotOverlap.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Windows; 3 | using System.Windows.Controls; 4 | using System.Windows.Data; 5 | using Xunit; 6 | 7 | namespace VirtualizingWrapPanelTest.Tests; 8 | 9 | public class GroupingTest_ItemsDoNotOverlap 10 | { 11 | private const int ViewportWidth = 500; 12 | 13 | private const int ViewportHeight = 500; 14 | 15 | private const int HeaderHeight = 20; 16 | 17 | private const int Margin = 5; 18 | 19 | private const int ItemsPerGroup = 15; // 3 rows a 5 items 20 | 21 | private const int GroupsCount = 10; 22 | 23 | private const int ItemsCount = ItemsPerGroup * GroupsCount; // 150 24 | 25 | private readonly ListBox itemsControl; 26 | 27 | private readonly VirtualizingStackPanel vsp; 28 | 29 | public GroupingTest_ItemsDoNotOverlap() 30 | { 31 | itemsControl = Setup(TestUtil.GenerateItems(ItemsCount, ItemsPerGroup)); 32 | vsp = TestUtil.GetVisualChild(itemsControl)!; 33 | } 34 | 35 | private static ListBox Setup(ObservableCollection items) 36 | { 37 | var collectionView = CollectionViewSource.GetDefaultView(items); 38 | collectionView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(TestItem.Group))); 39 | var itemsControl = TestUtil.CreateListBox(ViewportWidth + Margin + 2 /*Padding*/, ViewportHeight + 2 /*Padding*/, collectionView); 40 | itemsControl.GroupStyle.Add(new GroupStyle() { HeaderTemplate = TestUtil.CreateDefaultGroupHeaderTemplate(HeaderHeight) }); 41 | VirtualizingPanel.SetIsVirtualizingWhenGrouping(itemsControl, true); 42 | return itemsControl; 43 | } 44 | 45 | 46 | // #90 Items may sometimes appear overlapping 47 | [WpfFact] 48 | public async Task ItemsDoNotOverlap() 49 | { 50 | // scroll to end 51 | itemsControl.ScrollIntoView(itemsControl.Items[itemsControl.Items.Count - 1]); 52 | itemsControl.UpdateLayout(); 53 | await Task.Delay(1000); // TODO: find a better way to wait for layout to complete 54 | TestUtil.AssertItemRealized(vsp, "Item 150"); 55 | 56 | // check for overlapping items 57 | var itemContainers = TestUtil.FindItemContainers(vsp); 58 | foreach (var itemContainer in itemContainers) 59 | { 60 | var item = (TestItem)itemContainer.DataContext; 61 | var bounds = GetItemContainerBounds(itemContainer); 62 | 63 | foreach (var otherItemContainer in itemContainers.Except([itemContainer])) 64 | { 65 | var otherItem = (TestItem)otherItemContainer.DataContext; 66 | var otherBounds = GetItemContainerBounds(otherItemContainer); 67 | var intersection = Rect.Intersect(bounds, otherBounds); 68 | bool overlap = intersection.Width > 0 && intersection.Height > 0; 69 | Assert.False(overlap, $"Items {item.Name} and {otherItem.Name} are overlapping."); 70 | } 71 | } 72 | } 73 | 74 | private Rect GetItemContainerBounds(FrameworkElement element) 75 | { 76 | var position = element.TranslatePoint(new Point(0, 0), vsp); 77 | return new Rect(position, new Size(element.ActualWidth, element.ActualHeight)); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel/ReferenceEqualityComparer.cs: -------------------------------------------------------------------------------- 1 | #if NET462 2 | // Copied from https://raw.githubusercontent.com/dotnet/runtime/refs/tags/v8.0.0/src/libraries/System.Private.CoreLib/src/System/Collections/Generic/ReferenceEqualityComparer.cs 3 | 4 | // Licensed to the .NET Foundation under one or more agreements. 5 | // The .NET Foundation licenses this file to you under the MIT license. 6 | 7 | using System.Runtime.CompilerServices; 8 | 9 | namespace System.Collections.Generic 10 | { 11 | /// 12 | /// An that uses reference equality () 13 | /// instead of value equality () when comparing two object instances. 14 | /// 15 | /// 16 | /// The type cannot be instantiated. Instead, use the property 17 | /// to access the singleton instance of this type. 18 | /// 19 | internal sealed class ReferenceEqualityComparer : IEqualityComparer, IEqualityComparer 20 | { 21 | private ReferenceEqualityComparer() { } 22 | 23 | /// 24 | /// Gets the singleton instance. 25 | /// 26 | public static ReferenceEqualityComparer Instance { get; } = new ReferenceEqualityComparer(); 27 | 28 | /// 29 | /// Determines whether two object references refer to the same object instance. 30 | /// 31 | /// The first object to compare. 32 | /// The second object to compare. 33 | /// 34 | /// if both and refer to the same object instance 35 | /// or if both are ; otherwise, . 36 | /// 37 | /// 38 | /// This API is a wrapper around . 39 | /// It is not necessarily equivalent to calling . 40 | /// 41 | public new bool Equals(object? x, object? y) => ReferenceEquals(x, y); 42 | 43 | /// 44 | /// Returns a hash code for the specified object. The returned hash code is based on the object 45 | /// identity, not on the contents of the object. 46 | /// 47 | /// The object for which to retrieve the hash code. 48 | /// A hash code for the identity of . 49 | /// 50 | /// This API is a wrapper around . 51 | /// It is not necessarily equivalent to calling . 52 | /// 53 | public int GetHashCode(object? obj) 54 | { 55 | // Depending on target framework, RuntimeHelpers.GetHashCode might not be annotated 56 | // with the proper nullability attribute. We'll suppress any warning that might 57 | // result. 58 | return RuntimeHelpers.GetHashCode(obj!); 59 | } 60 | } 61 | } 62 | #endif 63 | -------------------------------------------------------------------------------- /docs/public/lunr.vi-3U4A337N.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/lunr-languages/lunr.vi.js"], 4 | "sourcesContent": ["/*!\n * Lunr languages, `Vietnamese` language\n * https://github.com/MihaiValentin/lunr-languages\n *\n * Copyright 2017, Keerati Thiwanruk\n * http://www.mozilla.org/MPL/\n */\n/*!\n * based on\n * Snowball JavaScript Library v0.3\n * http://code.google.com/p/urim/\n * http://snowball.tartarus.org/\n *\n * Copyright 2010, Oleg Mazko\n * http://www.mozilla.org/MPL/\n */\n\n/**\n * export the module via AMD, CommonJS or as a browser global\n * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js\n */\n;\n(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory)\n } else if (typeof exports === 'object') {\n /**\n * Node. Does not work with strict CommonJS, but\n * only CommonJS-like environments that support module.exports,\n * like Node.\n */\n module.exports = factory()\n } else {\n // Browser globals (root is window)\n factory()(root.lunr);\n }\n}(this, function() {\n /**\n * Just return a value to define the module export.\n * This example returns an object, but the module\n * can return a function as the exported value.\n */\n return function(lunr) {\n /* throw error if lunr is not yet included */\n if ('undefined' === typeof lunr) {\n throw new Error('Lunr is not present. Please include / require Lunr before this script.');\n }\n\n /* throw error if lunr stemmer support is not yet included */\n if ('undefined' === typeof lunr.stemmerSupport) {\n throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.');\n }\n\n /* register specific locale function */\n lunr.vi = function() {\n this.pipeline.reset();\n this.pipeline.add(\n lunr.vi.stopWordFilter,\n lunr.vi.trimmer\n );\n };\n\n /* lunr trimmer function */\n lunr.vi.wordCharacters = \"[\" +\n \"A-Za-z\" +\n \"\\u0300\\u0350\" + // d\u1EA5u huy\u1EC1n\n \"\\u0301\\u0351\" + // d\u1EA5u s\u1EAFc\n \"\\u0309\" + // d\u1EA5u h\u1ECFi\n \"\\u0323\" + // d\u1EA5u n\u1EB7ng\n \"\\u0303\\u0343\" + // d\u1EA5u ng\u00E3\n \"\\u00C2\\u00E2\" + // \u00C2\n \"\\u00CA\\u00EA\" + // \u00CA\n \"\\u00D4\\u00F4\" + // \u00D4\n \"\\u0102-\\u0103\" + // \u0102\n \"\\u0110-\\u0111\" + // \u0110\n \"\\u01A0-\\u01A1\" + // \u01A0\n \"\\u01AF-\\u01B0\" + // \u01AF\n \"]\";\n lunr.vi.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.vi.wordCharacters);\n lunr.Pipeline.registerFunction(lunr.vi.trimmer, 'trimmer-vi');\n lunr.vi.stopWordFilter = lunr.generateStopWordFilter('l\u00E0 c\u00E1i nh\u01B0ng m\u00E0'.split(' '));\n };\n}))"], 5 | "mappings": "4CAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,EAsBC,SAASC,EAAMC,EAAS,CACnB,OAAO,QAAW,YAAc,OAAO,IAEzC,OAAOA,CAAO,EACL,OAAOH,GAAY,SAM5BC,EAAO,QAAUE,EAAQ,EAGzBA,EAAQ,EAAED,EAAK,IAAI,CAEvB,GAAEF,EAAM,UAAW,CAMjB,OAAO,SAASI,EAAM,CAEpB,GAAoB,OAAOA,EAAvB,IACF,MAAM,IAAI,MAAM,wEAAwE,EAI1F,GAAoB,OAAOA,EAAK,eAA5B,IACF,MAAM,IAAI,MAAM,wGAAwG,EAI1HA,EAAK,GAAK,UAAW,CACnB,KAAK,SAAS,MAAM,EACpB,KAAK,SAAS,IACZA,EAAK,GAAG,eACRA,EAAK,GAAG,OACV,CACF,EAGAA,EAAK,GAAG,eAAiB,uIAezBA,EAAK,GAAG,QAAUA,EAAK,eAAe,gBAAgBA,EAAK,GAAG,cAAc,EAC5EA,EAAK,SAAS,iBAAiBA,EAAK,GAAG,QAAS,YAAY,EAC5DA,EAAK,GAAG,eAAiBA,EAAK,uBAAuB,gCAAkB,MAAM,GAAG,CAAC,CACnF,CACF,CAAC", 6 | "names": ["require_lunr_vi", "__commonJSMin", "exports", "module", "root", "factory", "lunr"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/lunr.vi-QNO46JPR.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/lunr-languages/lunr.vi.js"], 4 | "sourcesContent": ["/*!\n * Lunr languages, `Vietnamese` language\n * https://github.com/MihaiValentin/lunr-languages\n *\n * Copyright 2017, Keerati Thiwanruk\n * http://www.mozilla.org/MPL/\n */\n/*!\n * based on\n * Snowball JavaScript Library v0.3\n * http://code.google.com/p/urim/\n * http://snowball.tartarus.org/\n *\n * Copyright 2010, Oleg Mazko\n * http://www.mozilla.org/MPL/\n */\n\n/**\n * export the module via AMD, CommonJS or as a browser global\n * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js\n */\n;\n(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory)\n } else if (typeof exports === 'object') {\n /**\n * Node. Does not work with strict CommonJS, but\n * only CommonJS-like environments that support module.exports,\n * like Node.\n */\n module.exports = factory()\n } else {\n // Browser globals (root is window)\n factory()(root.lunr);\n }\n}(this, function() {\n /**\n * Just return a value to define the module export.\n * This example returns an object, but the module\n * can return a function as the exported value.\n */\n return function(lunr) {\n /* throw error if lunr is not yet included */\n if ('undefined' === typeof lunr) {\n throw new Error('Lunr is not present. Please include / require Lunr before this script.');\n }\n\n /* throw error if lunr stemmer support is not yet included */\n if ('undefined' === typeof lunr.stemmerSupport) {\n throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.');\n }\n\n /* register specific locale function */\n lunr.vi = function() {\n this.pipeline.reset();\n this.pipeline.add(\n lunr.vi.stopWordFilter,\n lunr.vi.trimmer\n );\n };\n\n /* lunr trimmer function */\n lunr.vi.wordCharacters = \"[\" +\n \"A-Za-z\" +\n \"\\u0300\\u0350\" + // d\u1EA5u huy\u1EC1n\n \"\\u0301\\u0351\" + // d\u1EA5u s\u1EAFc\n \"\\u0309\" + // d\u1EA5u h\u1ECFi\n \"\\u0323\" + // d\u1EA5u n\u1EB7ng\n \"\\u0303\\u0343\" + // d\u1EA5u ng\u00E3\n \"\\u00C2\\u00E2\" + // \u00C2\n \"\\u00CA\\u00EA\" + // \u00CA\n \"\\u00D4\\u00F4\" + // \u00D4\n \"\\u0102-\\u0103\" + // \u0102\n \"\\u0110-\\u0111\" + // \u0110\n \"\\u01A0-\\u01A1\" + // \u01A0\n \"\\u01AF-\\u01B0\" + // \u01AF\n \"]\";\n lunr.vi.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.vi.wordCharacters);\n lunr.Pipeline.registerFunction(lunr.vi.trimmer, 'trimmer-vi');\n lunr.vi.stopWordFilter = lunr.generateStopWordFilter('l\u00E0 c\u00E1i nh\u01B0ng m\u00E0'.split(' '));\n };\n}))"], 5 | "mappings": "4CAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,EAsBC,SAASC,EAAMC,EAAS,CACnB,OAAO,QAAW,YAAc,OAAO,IAEzC,OAAOA,CAAO,EACL,OAAOH,GAAY,SAM5BC,EAAO,QAAUE,EAAQ,EAGzBA,EAAQ,EAAED,EAAK,IAAI,CAEvB,GAAEF,EAAM,UAAW,CAMjB,OAAO,SAASI,EAAM,CAEpB,GAAoB,OAAOA,EAAvB,IACF,MAAM,IAAI,MAAM,wEAAwE,EAI1F,GAAoB,OAAOA,EAAK,eAA5B,IACF,MAAM,IAAI,MAAM,wGAAwG,EAI1HA,EAAK,GAAK,UAAW,CACnB,KAAK,SAAS,MAAM,EACpB,KAAK,SAAS,IACZA,EAAK,GAAG,eACRA,EAAK,GAAG,OACV,CACF,EAGAA,EAAK,GAAG,eAAiB,uIAezBA,EAAK,GAAG,QAAUA,EAAK,eAAe,gBAAgBA,EAAK,GAAG,cAAc,EAC5EA,EAAK,SAAS,iBAAiBA,EAAK,GAAG,QAAS,YAAY,EAC5DA,EAAK,GAAG,eAAiBA,EAAK,uBAAuB,gCAAkB,MAAM,GAAG,CAAC,CACnF,CACF,CAAC", 6 | "names": ["require_lunr_vi", "__commonJSMin", "exports", "module", "root", "factory", "lunr"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/lunr.vi-S3VOAA5A.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/lunr-languages/lunr.vi.js"], 4 | "sourcesContent": ["/*!\n * Lunr languages, `Vietnamese` language\n * https://github.com/MihaiValentin/lunr-languages\n *\n * Copyright 2017, Keerati Thiwanruk\n * http://www.mozilla.org/MPL/\n */\n/*!\n * based on\n * Snowball JavaScript Library v0.3\n * http://code.google.com/p/urim/\n * http://snowball.tartarus.org/\n *\n * Copyright 2010, Oleg Mazko\n * http://www.mozilla.org/MPL/\n */\n\n/**\n * export the module via AMD, CommonJS or as a browser global\n * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js\n */\n;\n(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory)\n } else if (typeof exports === 'object') {\n /**\n * Node. Does not work with strict CommonJS, but\n * only CommonJS-like environments that support module.exports,\n * like Node.\n */\n module.exports = factory()\n } else {\n // Browser globals (root is window)\n factory()(root.lunr);\n }\n}(this, function() {\n /**\n * Just return a value to define the module export.\n * This example returns an object, but the module\n * can return a function as the exported value.\n */\n return function(lunr) {\n /* throw error if lunr is not yet included */\n if ('undefined' === typeof lunr) {\n throw new Error('Lunr is not present. Please include / require Lunr before this script.');\n }\n\n /* throw error if lunr stemmer support is not yet included */\n if ('undefined' === typeof lunr.stemmerSupport) {\n throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.');\n }\n\n /* register specific locale function */\n lunr.vi = function() {\n this.pipeline.reset();\n this.pipeline.add(\n lunr.vi.stopWordFilter,\n lunr.vi.trimmer\n );\n };\n\n /* lunr trimmer function */\n lunr.vi.wordCharacters = \"[\" +\n \"A-Za-z\" +\n \"\\u0300\\u0350\" + // d\u1EA5u huy\u1EC1n\n \"\\u0301\\u0351\" + // d\u1EA5u s\u1EAFc\n \"\\u0309\" + // d\u1EA5u h\u1ECFi\n \"\\u0323\" + // d\u1EA5u n\u1EB7ng\n \"\\u0303\\u0343\" + // d\u1EA5u ng\u00E3\n \"\\u00C2\\u00E2\" + // \u00C2\n \"\\u00CA\\u00EA\" + // \u00CA\n \"\\u00D4\\u00F4\" + // \u00D4\n \"\\u0102-\\u0103\" + // \u0102\n \"\\u0110-\\u0111\" + // \u0110\n \"\\u01A0-\\u01A1\" + // \u01A0\n \"\\u01AF-\\u01B0\" + // \u01AF\n \"]\";\n lunr.vi.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.vi.wordCharacters);\n lunr.Pipeline.registerFunction(lunr.vi.trimmer, 'trimmer-vi');\n lunr.vi.stopWordFilter = lunr.generateStopWordFilter('l\u00E0 c\u00E1i nh\u01B0ng m\u00E0'.split(' '));\n };\n}))"], 5 | "mappings": "4CAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,EAsBC,SAASC,EAAMC,EAAS,CACnB,OAAO,QAAW,YAAc,OAAO,IAEzC,OAAOA,CAAO,EACL,OAAOH,GAAY,SAM5BC,EAAO,QAAUE,EAAQ,EAGzBA,EAAQ,EAAED,EAAK,IAAI,CAEvB,GAAEF,EAAM,UAAW,CAMjB,OAAO,SAASI,EAAM,CAEpB,GAAoB,OAAOA,EAAvB,IACF,MAAM,IAAI,MAAM,wEAAwE,EAI1F,GAAoB,OAAOA,EAAK,eAA5B,IACF,MAAM,IAAI,MAAM,wGAAwG,EAI1HA,EAAK,GAAK,UAAW,CACnB,KAAK,SAAS,MAAM,EACpB,KAAK,SAAS,IACZA,EAAK,GAAG,eACRA,EAAK,GAAG,OACV,CACF,EAGAA,EAAK,GAAG,eAAiB,uIAezBA,EAAK,GAAG,QAAUA,EAAK,eAAe,gBAAgBA,EAAK,GAAG,cAAc,EAC5EA,EAAK,SAAS,iBAAiBA,EAAK,GAAG,QAAS,YAAY,EAC5DA,EAAK,GAAG,eAAiBA,EAAK,uBAAuB,gCAAkB,MAAM,GAAG,CAAC,CACnF,CACF,CAAC", 6 | "names": ["require_lunr_vi", "__commonJSMin", "exports", "module", "root", "factory", "lunr"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/chunk-JL3VILNY.min.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../node_modules/mermaid/dist/chunks/mermaid.core/chunk-BO7VGL7K.mjs"], 4 | "sourcesContent": ["import {\n insertEdge,\n insertEdgeLabel,\n markers_default,\n positionEdgeLabel\n} from \"./chunk-66SQ7PYY.mjs\";\nimport {\n insertCluster,\n insertNode,\n labelHelper\n} from \"./chunk-7NZE2EM7.mjs\";\nimport {\n interpolateToCurve\n} from \"./chunk-7DKRZKHE.mjs\";\nimport {\n __name,\n common_default,\n getConfig,\n log\n} from \"./chunk-6DBFFHIP.mjs\";\n\n// src/internals.ts\nvar internalHelpers = {\n common: common_default,\n getConfig,\n insertCluster,\n insertEdge,\n insertEdgeLabel,\n insertMarkers: markers_default,\n insertNode,\n interpolateToCurve,\n labelHelper,\n log,\n positionEdgeLabel\n};\n\n// src/rendering-util/render.ts\nvar layoutAlgorithms = {};\nvar registerLayoutLoaders = /* @__PURE__ */ __name((loaders) => {\n for (const loader of loaders) {\n layoutAlgorithms[loader.name] = loader;\n }\n}, \"registerLayoutLoaders\");\nvar registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {\n registerLayoutLoaders([\n {\n name: \"dagre\",\n loader: /* @__PURE__ */ __name(async () => await import(\"./dagre-4EVJKHTY.mjs\"), \"loader\")\n }\n ]);\n}, \"registerDefaultLayoutLoaders\");\nregisterDefaultLayoutLoaders();\nvar render = /* @__PURE__ */ __name(async (data4Layout, svg) => {\n if (!(data4Layout.layoutAlgorithm in layoutAlgorithms)) {\n throw new Error(`Unknown layout algorithm: ${data4Layout.layoutAlgorithm}`);\n }\n const layoutDefinition = layoutAlgorithms[data4Layout.layoutAlgorithm];\n const layoutRenderer = await layoutDefinition.loader();\n return layoutRenderer.render(data4Layout, svg, internalHelpers, {\n algorithm: layoutDefinition.algorithm\n });\n}, \"render\");\nvar getRegisteredLayoutAlgorithm = /* @__PURE__ */ __name((algorithm = \"\", { fallback = \"dagre\" } = {}) => {\n if (algorithm in layoutAlgorithms) {\n return algorithm;\n }\n if (fallback in layoutAlgorithms) {\n log.warn(`Layout algorithm ${algorithm} is not registered. Using ${fallback} as fallback.`);\n return fallback;\n }\n throw new Error(`Both layout algorithms ${algorithm} and ${fallback} are not registered.`);\n}, \"getRegisteredLayoutAlgorithm\");\n\nexport {\n registerLayoutLoaders,\n render,\n getRegisteredLayoutAlgorithm\n};\n"], 5 | "mappings": "wOAsBA,IAAIA,EAAkB,CACpB,OAAQC,EACR,UAAAC,EACA,cAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,cAAeC,EACf,WAAAC,EACA,mBAAAC,EACA,YAAAC,EACA,IAAAC,EACA,kBAAAC,CACF,EAGIC,EAAmB,CAAC,EACpBC,EAAwCC,EAAQC,GAAY,CAC9D,QAAWC,KAAUD,EACnBH,EAAiBI,EAAO,IAAI,EAAIA,CAEpC,EAAG,uBAAuB,EACtBC,EAA+CH,EAAO,IAAM,CAC9DD,EAAsB,CACpB,CACE,KAAM,QACN,OAAwBC,EAAO,SAAY,KAAM,QAAO,kCAAsB,EAAG,QAAQ,CAC3F,CACF,CAAC,CACH,EAAG,8BAA8B,EACjCG,EAA6B,EAC7B,IAAIC,EAAyBJ,EAAO,MAAOK,EAAaC,IAAQ,CAC9D,GAAI,EAAED,EAAY,mBAAmBP,GACnC,MAAM,IAAI,MAAM,6BAA6BO,EAAY,eAAe,EAAE,EAE5E,IAAME,EAAmBT,EAAiBO,EAAY,eAAe,EAErE,OADuB,MAAME,EAAiB,OAAO,GAC/B,OAAOF,EAAaC,EAAKpB,EAAiB,CAC9D,UAAWqB,EAAiB,SAC9B,CAAC,CACH,EAAG,QAAQ,EACPC,EAA+CR,EAAO,CAACS,EAAY,GAAI,CAAE,SAAAC,EAAW,OAAQ,EAAI,CAAC,IAAM,CACzG,GAAID,KAAaX,EACf,OAAOW,EAET,GAAIC,KAAYZ,EACd,OAAAF,EAAI,KAAK,oBAAoBa,CAAS,6BAA6BC,CAAQ,eAAe,EACnFA,EAET,MAAM,IAAI,MAAM,0BAA0BD,CAAS,QAAQC,CAAQ,sBAAsB,CAC3F,EAAG,8BAA8B", 6 | "names": ["internalHelpers", "common_default", "getConfig", "insertCluster", "insertEdge", "insertEdgeLabel", "markers_default", "insertNode", "interpolateToCurve", "labelHelper", "log", "positionEdgeLabel", "layoutAlgorithms", "registerLayoutLoaders", "__name", "loaders", "loader", "registerDefaultLayoutLoaders", "render", "data4Layout", "svg", "layoutDefinition", "getRegisteredLayoutAlgorithm", "algorithm", "fallback"] 7 | } 8 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanel.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.3.32922.545 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtualizingWrapPanelSamples", "VirtualizingWrapPanelSamples\VirtualizingWrapPanelSamples.csproj", "{F3E7F4E3-787B-4CAD-A184-196C8B169268}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtualizingWrapPanel", "VirtualizingWrapPanel\VirtualizingWrapPanel.csproj", "{E9F2BA01-2E07-4B5A-BA8C-AD26AAEEB8B5}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualizingWrapPanelSamplesFW", "VirtualizingWrapPanelSamplesFW\VirtualizingWrapPanelSamplesFW.csproj", "{DD3AA1D2-10F2-48CA-A0E2-E03C03FD2A21}" 11 | EndProject 12 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7D90FE24-28B2-4292-A1D7-EED79638ACA5}" 13 | ProjectSection(SolutionItems) = preProject 14 | .editorconfig = .editorconfig 15 | EndProjectSection 16 | EndProject 17 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualizingWrapPanelTest", "VirtualizingWrapPanelTest\VirtualizingWrapPanelTest.csproj", "{AA7642F6-10AD-4F5D-89F4-CAD620FDF420}" 18 | EndProject 19 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualizingWrapPanelPerformanceTest", "VirtualizingWrapPanelPerformanceTest\VirtualizingWrapPanelPerformanceTest.csproj", "{869BB7EE-7FE0-4C52-8E73-669499C25561}" 20 | EndProject 21 | Global 22 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 23 | Debug|Any CPU = Debug|Any CPU 24 | Release|Any CPU = Release|Any CPU 25 | EndGlobalSection 26 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 27 | {F3E7F4E3-787B-4CAD-A184-196C8B169268}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 28 | {F3E7F4E3-787B-4CAD-A184-196C8B169268}.Debug|Any CPU.Build.0 = Debug|Any CPU 29 | {F3E7F4E3-787B-4CAD-A184-196C8B169268}.Release|Any CPU.ActiveCfg = Release|Any CPU 30 | {F3E7F4E3-787B-4CAD-A184-196C8B169268}.Release|Any CPU.Build.0 = Release|Any CPU 31 | {E9F2BA01-2E07-4B5A-BA8C-AD26AAEEB8B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 32 | {E9F2BA01-2E07-4B5A-BA8C-AD26AAEEB8B5}.Debug|Any CPU.Build.0 = Debug|Any CPU 33 | {E9F2BA01-2E07-4B5A-BA8C-AD26AAEEB8B5}.Release|Any CPU.ActiveCfg = Release|Any CPU 34 | {E9F2BA01-2E07-4B5A-BA8C-AD26AAEEB8B5}.Release|Any CPU.Build.0 = Release|Any CPU 35 | {DD3AA1D2-10F2-48CA-A0E2-E03C03FD2A21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 36 | {DD3AA1D2-10F2-48CA-A0E2-E03C03FD2A21}.Debug|Any CPU.Build.0 = Debug|Any CPU 37 | {DD3AA1D2-10F2-48CA-A0E2-E03C03FD2A21}.Release|Any CPU.ActiveCfg = Release|Any CPU 38 | {DD3AA1D2-10F2-48CA-A0E2-E03C03FD2A21}.Release|Any CPU.Build.0 = Release|Any CPU 39 | {AA7642F6-10AD-4F5D-89F4-CAD620FDF420}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 40 | {AA7642F6-10AD-4F5D-89F4-CAD620FDF420}.Debug|Any CPU.Build.0 = Debug|Any CPU 41 | {AA7642F6-10AD-4F5D-89F4-CAD620FDF420}.Release|Any CPU.ActiveCfg = Release|Any CPU 42 | {AA7642F6-10AD-4F5D-89F4-CAD620FDF420}.Release|Any CPU.Build.0 = Release|Any CPU 43 | {869BB7EE-7FE0-4C52-8E73-669499C25561}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 44 | {869BB7EE-7FE0-4C52-8E73-669499C25561}.Debug|Any CPU.Build.0 = Debug|Any CPU 45 | {869BB7EE-7FE0-4C52-8E73-669499C25561}.Release|Any CPU.ActiveCfg = Release|Any CPU 46 | {869BB7EE-7FE0-4C52-8E73-669499C25561}.Release|Any CPU.Build.0 = Release|Any CPU 47 | EndGlobalSection 48 | GlobalSection(SolutionProperties) = preSolution 49 | HideSolutionNode = FALSE 50 | EndGlobalSection 51 | GlobalSection(ExtensibilityGlobals) = postSolution 52 | SolutionGuid = {75DC64A9-2D54-4E67-AB70-A5D79CC3C1C6} 53 | EndGlobalSection 54 | EndGlobal 55 | -------------------------------------------------------------------------------- /docs/public/lunr.te-2RZIMFIT.min.js: -------------------------------------------------------------------------------- 1 | import{b as o}from"./chunk-XUHMPXWX.min.js";var p=o((n,u)=>{(function(e,r){typeof define=="function"&&define.amd?define(r):typeof n=="object"?u.exports=r():r()(e.lunr)})(n,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="\u0C00-\u0C04\u0C05-\u0C14\u0C15-\u0C39\u0C3E-\u0C4C\u0C55-\u0C56\u0C58-\u0C5A\u0C60-\u0C61\u0C62-\u0C63\u0C66-\u0C6F\u0C78-\u0C7F\u0C3C\u0C3D\u0C4D\u0C5D\u0C77\u0C64\u0C65",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("\u0C05\u0C02\u0C26\u0C30\u0C42 \u0C05\u0C02\u0C26\u0C41\u0C2C\u0C3E\u0C1F\u0C41\u0C32\u0C4B \u0C05\u0C21\u0C17\u0C02\u0C21\u0C3F \u0C05\u0C21\u0C17\u0C21\u0C02 \u0C05\u0C21\u0C4D\u0C21\u0C02\u0C17\u0C3E \u0C05\u0C28\u0C41\u0C17\u0C41\u0C23\u0C02\u0C17\u0C3E \u0C05\u0C28\u0C41\u0C2E\u0C24\u0C3F\u0C02\u0C1A\u0C41 \u0C05\u0C28\u0C41\u0C2E\u0C24\u0C3F\u0C38\u0C4D\u0C24\u0C41\u0C02\u0C26\u0C3F \u0C05\u0C2F\u0C3F\u0C24\u0C47 \u0C07\u0C2A\u0C4D\u0C2A\u0C1F\u0C3F\u0C15\u0C47 \u0C09\u0C28\u0C4D\u0C28\u0C3E\u0C30\u0C41 \u0C0E\u0C15\u0C4D\u0C15\u0C21\u0C48\u0C28\u0C3E \u0C0E\u0C2A\u0C4D\u0C2A\u0C41\u0C21\u0C41 \u0C0E\u0C35\u0C30\u0C48\u0C28\u0C3E \u0C0E\u0C35\u0C30\u0C4B \u0C0F \u0C0F\u0C26\u0C48\u0C28\u0C3E \u0C0F\u0C2E\u0C48\u0C28\u0C2A\u0C4D\u0C2A\u0C1F\u0C3F\u0C15\u0C3F \u0C12\u0C15 \u0C12\u0C15\u0C30\u0C41 \u0C15\u0C28\u0C3F\u0C2A\u0C3F\u0C38\u0C4D\u0C24\u0C3E\u0C2F\u0C3F \u0C15\u0C3E\u0C26\u0C41 \u0C15\u0C42\u0C21\u0C3E \u0C17\u0C3E \u0C17\u0C41\u0C30\u0C3F\u0C02\u0C1A\u0C3F \u0C1A\u0C41\u0C1F\u0C4D\u0C1F\u0C42 \u0C1A\u0C47\u0C2F\u0C17\u0C32\u0C3F\u0C17\u0C3F\u0C02\u0C26\u0C3F \u0C24\u0C17\u0C3F\u0C28 \u0C24\u0C30\u0C4D\u0C35\u0C3E\u0C24 \u0C26\u0C3E\u0C26\u0C3E\u0C2A\u0C41 \u0C26\u0C42\u0C30\u0C02\u0C17\u0C3E \u0C28\u0C3F\u0C1C\u0C02\u0C17\u0C3E \u0C2A\u0C48 \u0C2A\u0C4D\u0C30\u0C15\u0C3E\u0C30\u0C02 \u0C2A\u0C4D\u0C30\u0C15\u0C4D\u0C15\u0C28 \u0C2E\u0C27\u0C4D\u0C2F \u0C2E\u0C30\u0C3F\u0C2F\u0C41 \u0C2E\u0C30\u0C4A\u0C15 \u0C2E\u0C33\u0C4D\u0C33\u0C40 \u0C2E\u0C3E\u0C24\u0C4D\u0C30\u0C2E\u0C47 \u0C2E\u0C46\u0C1A\u0C4D\u0C1A\u0C41\u0C15\u0C4B \u0C35\u0C26\u0C4D\u0C26 \u0C35\u0C46\u0C02\u0C1F \u0C35\u0C47\u0C30\u0C41\u0C17\u0C3E \u0C35\u0C4D\u0C2F\u0C24\u0C3F\u0C30\u0C47\u0C15\u0C02\u0C17\u0C3E \u0C38\u0C02\u0C2C\u0C02\u0C27\u0C02".split(" ")),e.te.stemmer=function(){return function(t){return typeof t.update=="function"?t.update(function(i){return i}):t}}();var r=e.wordcut;r.init(),e.te.tokenizer=function(t){if(!arguments.length||t==null||t==null)return[];if(Array.isArray(t))return t.map(function(s){return isLunr2?new e.Token(s.toLowerCase()):s.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}})});export default p(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.te.js: 5 | (*! 6 | * Lunr languages, `Hindi` language 7 | * https://github.com/MiKr13/lunr-languages 8 | * 9 | * Copyright 2023, India 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.te-2RZIMFIT.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.te-JGGL3BFP.min.js: -------------------------------------------------------------------------------- 1 | import{a as o}from"./chunk-OSRY5VT3.min.js";var p=o((n,u)=>{(function(e,r){typeof define=="function"&&define.amd?define(r):typeof n=="object"?u.exports=r():r()(e.lunr)})(n,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="\u0C00-\u0C04\u0C05-\u0C14\u0C15-\u0C39\u0C3E-\u0C4C\u0C55-\u0C56\u0C58-\u0C5A\u0C60-\u0C61\u0C62-\u0C63\u0C66-\u0C6F\u0C78-\u0C7F\u0C3C\u0C3D\u0C4D\u0C5D\u0C77\u0C64\u0C65",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("\u0C05\u0C02\u0C26\u0C30\u0C42 \u0C05\u0C02\u0C26\u0C41\u0C2C\u0C3E\u0C1F\u0C41\u0C32\u0C4B \u0C05\u0C21\u0C17\u0C02\u0C21\u0C3F \u0C05\u0C21\u0C17\u0C21\u0C02 \u0C05\u0C21\u0C4D\u0C21\u0C02\u0C17\u0C3E \u0C05\u0C28\u0C41\u0C17\u0C41\u0C23\u0C02\u0C17\u0C3E \u0C05\u0C28\u0C41\u0C2E\u0C24\u0C3F\u0C02\u0C1A\u0C41 \u0C05\u0C28\u0C41\u0C2E\u0C24\u0C3F\u0C38\u0C4D\u0C24\u0C41\u0C02\u0C26\u0C3F \u0C05\u0C2F\u0C3F\u0C24\u0C47 \u0C07\u0C2A\u0C4D\u0C2A\u0C1F\u0C3F\u0C15\u0C47 \u0C09\u0C28\u0C4D\u0C28\u0C3E\u0C30\u0C41 \u0C0E\u0C15\u0C4D\u0C15\u0C21\u0C48\u0C28\u0C3E \u0C0E\u0C2A\u0C4D\u0C2A\u0C41\u0C21\u0C41 \u0C0E\u0C35\u0C30\u0C48\u0C28\u0C3E \u0C0E\u0C35\u0C30\u0C4B \u0C0F \u0C0F\u0C26\u0C48\u0C28\u0C3E \u0C0F\u0C2E\u0C48\u0C28\u0C2A\u0C4D\u0C2A\u0C1F\u0C3F\u0C15\u0C3F \u0C12\u0C15 \u0C12\u0C15\u0C30\u0C41 \u0C15\u0C28\u0C3F\u0C2A\u0C3F\u0C38\u0C4D\u0C24\u0C3E\u0C2F\u0C3F \u0C15\u0C3E\u0C26\u0C41 \u0C15\u0C42\u0C21\u0C3E \u0C17\u0C3E \u0C17\u0C41\u0C30\u0C3F\u0C02\u0C1A\u0C3F \u0C1A\u0C41\u0C1F\u0C4D\u0C1F\u0C42 \u0C1A\u0C47\u0C2F\u0C17\u0C32\u0C3F\u0C17\u0C3F\u0C02\u0C26\u0C3F \u0C24\u0C17\u0C3F\u0C28 \u0C24\u0C30\u0C4D\u0C35\u0C3E\u0C24 \u0C26\u0C3E\u0C26\u0C3E\u0C2A\u0C41 \u0C26\u0C42\u0C30\u0C02\u0C17\u0C3E \u0C28\u0C3F\u0C1C\u0C02\u0C17\u0C3E \u0C2A\u0C48 \u0C2A\u0C4D\u0C30\u0C15\u0C3E\u0C30\u0C02 \u0C2A\u0C4D\u0C30\u0C15\u0C4D\u0C15\u0C28 \u0C2E\u0C27\u0C4D\u0C2F \u0C2E\u0C30\u0C3F\u0C2F\u0C41 \u0C2E\u0C30\u0C4A\u0C15 \u0C2E\u0C33\u0C4D\u0C33\u0C40 \u0C2E\u0C3E\u0C24\u0C4D\u0C30\u0C2E\u0C47 \u0C2E\u0C46\u0C1A\u0C4D\u0C1A\u0C41\u0C15\u0C4B \u0C35\u0C26\u0C4D\u0C26 \u0C35\u0C46\u0C02\u0C1F \u0C35\u0C47\u0C30\u0C41\u0C17\u0C3E \u0C35\u0C4D\u0C2F\u0C24\u0C3F\u0C30\u0C47\u0C15\u0C02\u0C17\u0C3E \u0C38\u0C02\u0C2C\u0C02\u0C27\u0C02".split(" ")),e.te.stemmer=function(){return function(t){return typeof t.update=="function"?t.update(function(i){return i}):t}}();var r=e.wordcut;r.init(),e.te.tokenizer=function(t){if(!arguments.length||t==null||t==null)return[];if(Array.isArray(t))return t.map(function(s){return isLunr2?new e.Token(s.toLowerCase()):s.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}})});export default p(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.te.js: 5 | (*! 6 | * Lunr languages, `Hindi` language 7 | * https://github.com/MiKr13/lunr-languages 8 | * 9 | * Copyright 2023, India 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.te-JGGL3BFP.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.te-OBAK5FVS.min.js: -------------------------------------------------------------------------------- 1 | import{b as o}from"./chunk-P42HNYSU.min.js";var p=o((n,u)=>{(function(e,r){typeof define=="function"&&define.amd?define(r):typeof n=="object"?u.exports=r():r()(e.lunr)})(n,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="\u0C00-\u0C04\u0C05-\u0C14\u0C15-\u0C39\u0C3E-\u0C4C\u0C55-\u0C56\u0C58-\u0C5A\u0C60-\u0C61\u0C62-\u0C63\u0C66-\u0C6F\u0C78-\u0C7F\u0C3C\u0C3D\u0C4D\u0C5D\u0C77\u0C64\u0C65",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("\u0C05\u0C02\u0C26\u0C30\u0C42 \u0C05\u0C02\u0C26\u0C41\u0C2C\u0C3E\u0C1F\u0C41\u0C32\u0C4B \u0C05\u0C21\u0C17\u0C02\u0C21\u0C3F \u0C05\u0C21\u0C17\u0C21\u0C02 \u0C05\u0C21\u0C4D\u0C21\u0C02\u0C17\u0C3E \u0C05\u0C28\u0C41\u0C17\u0C41\u0C23\u0C02\u0C17\u0C3E \u0C05\u0C28\u0C41\u0C2E\u0C24\u0C3F\u0C02\u0C1A\u0C41 \u0C05\u0C28\u0C41\u0C2E\u0C24\u0C3F\u0C38\u0C4D\u0C24\u0C41\u0C02\u0C26\u0C3F \u0C05\u0C2F\u0C3F\u0C24\u0C47 \u0C07\u0C2A\u0C4D\u0C2A\u0C1F\u0C3F\u0C15\u0C47 \u0C09\u0C28\u0C4D\u0C28\u0C3E\u0C30\u0C41 \u0C0E\u0C15\u0C4D\u0C15\u0C21\u0C48\u0C28\u0C3E \u0C0E\u0C2A\u0C4D\u0C2A\u0C41\u0C21\u0C41 \u0C0E\u0C35\u0C30\u0C48\u0C28\u0C3E \u0C0E\u0C35\u0C30\u0C4B \u0C0F \u0C0F\u0C26\u0C48\u0C28\u0C3E \u0C0F\u0C2E\u0C48\u0C28\u0C2A\u0C4D\u0C2A\u0C1F\u0C3F\u0C15\u0C3F \u0C12\u0C15 \u0C12\u0C15\u0C30\u0C41 \u0C15\u0C28\u0C3F\u0C2A\u0C3F\u0C38\u0C4D\u0C24\u0C3E\u0C2F\u0C3F \u0C15\u0C3E\u0C26\u0C41 \u0C15\u0C42\u0C21\u0C3E \u0C17\u0C3E \u0C17\u0C41\u0C30\u0C3F\u0C02\u0C1A\u0C3F \u0C1A\u0C41\u0C1F\u0C4D\u0C1F\u0C42 \u0C1A\u0C47\u0C2F\u0C17\u0C32\u0C3F\u0C17\u0C3F\u0C02\u0C26\u0C3F \u0C24\u0C17\u0C3F\u0C28 \u0C24\u0C30\u0C4D\u0C35\u0C3E\u0C24 \u0C26\u0C3E\u0C26\u0C3E\u0C2A\u0C41 \u0C26\u0C42\u0C30\u0C02\u0C17\u0C3E \u0C28\u0C3F\u0C1C\u0C02\u0C17\u0C3E \u0C2A\u0C48 \u0C2A\u0C4D\u0C30\u0C15\u0C3E\u0C30\u0C02 \u0C2A\u0C4D\u0C30\u0C15\u0C4D\u0C15\u0C28 \u0C2E\u0C27\u0C4D\u0C2F \u0C2E\u0C30\u0C3F\u0C2F\u0C41 \u0C2E\u0C30\u0C4A\u0C15 \u0C2E\u0C33\u0C4D\u0C33\u0C40 \u0C2E\u0C3E\u0C24\u0C4D\u0C30\u0C2E\u0C47 \u0C2E\u0C46\u0C1A\u0C4D\u0C1A\u0C41\u0C15\u0C4B \u0C35\u0C26\u0C4D\u0C26 \u0C35\u0C46\u0C02\u0C1F \u0C35\u0C47\u0C30\u0C41\u0C17\u0C3E \u0C35\u0C4D\u0C2F\u0C24\u0C3F\u0C30\u0C47\u0C15\u0C02\u0C17\u0C3E \u0C38\u0C02\u0C2C\u0C02\u0C27\u0C02".split(" ")),e.te.stemmer=function(){return function(t){return typeof t.update=="function"?t.update(function(i){return i}):t}}();var r=e.wordcut;r.init(),e.te.tokenizer=function(t){if(!arguments.length||t==null||t==null)return[];if(Array.isArray(t))return t.map(function(s){return isLunr2?new e.Token(s.toLowerCase()):s.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}})});export default p(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.te.js: 5 | (*! 6 | * Lunr languages, `Hindi` language 7 | * https://github.com/MiKr13/lunr-languages 8 | * 9 | * Copyright 2023, India 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.te-OBAK5FVS.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.ta-AKIPBQLC.min.js: -------------------------------------------------------------------------------- 1 | import{b as s}from"./chunk-P42HNYSU.min.js";var o=s((n,a)=>{(function(e,r){typeof define=="function"&&define.amd?define(r):typeof n=="object"?a.exports=r():r()(e.lunr)})(n,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="\u0B80-\u0B89\u0B8A-\u0B8F\u0B90-\u0B99\u0B9A-\u0B9F\u0BA0-\u0BA9\u0BAA-\u0BAF\u0BB0-\u0BB9\u0BBA-\u0BBF\u0BC0-\u0BC9\u0BCA-\u0BCF\u0BD0-\u0BD9\u0BDA-\u0BDF\u0BE0-\u0BE9\u0BEA-\u0BEF\u0BF0-\u0BF9\u0BFA-\u0BFFa-zA-Z\uFF41-\uFF5A\uFF21-\uFF3A0-9\uFF10-\uFF19",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("\u0B85\u0B99\u0BCD\u0B95\u0BC1 \u0B85\u0B99\u0BCD\u0B95\u0BC7 \u0B85\u0BA4\u0BC1 \u0B85\u0BA4\u0BC8 \u0B85\u0BA8\u0BCD\u0BA4 \u0B85\u0BB5\u0BB0\u0BCD \u0B85\u0BB5\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B85\u0BB5\u0BB3\u0BCD \u0B85\u0BB5\u0BA9\u0BCD \u0B85\u0BB5\u0BC8 \u0B86\u0B95 \u0B86\u0B95\u0BB5\u0BC7 \u0B86\u0B95\u0BC8\u0BAF\u0BBE\u0BB2\u0BCD \u0B86\u0BA4\u0BB2\u0BBE\u0BB2\u0BCD \u0B86\u0BA4\u0BB2\u0BBF\u0BA9\u0BBE\u0BB2\u0BCD \u0B86\u0BA9\u0BBE\u0BB2\u0BC1\u0BAE\u0BCD \u0B86\u0BA9\u0BBE\u0BB2\u0BCD \u0B87\u0B99\u0BCD\u0B95\u0BC1 \u0B87\u0B99\u0BCD\u0B95\u0BC7 \u0B87\u0BA4\u0BC1 \u0B87\u0BA4\u0BC8 \u0B87\u0BA8\u0BCD\u0BA4 \u0B87\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF \u0B87\u0BB5\u0BB0\u0BCD \u0B87\u0BB5\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B87\u0BB5\u0BB3\u0BCD \u0B87\u0BB5\u0BA9\u0BCD \u0B87\u0BB5\u0BC8 \u0B87\u0BB5\u0BCD\u0BB5\u0BB3\u0BB5\u0BC1 \u0B89\u0BA9\u0B95\u0BCD\u0B95\u0BC1 \u0B89\u0BA9\u0BA4\u0BC1 \u0B89\u0BA9\u0BCD \u0B89\u0BA9\u0BCD\u0BA9\u0BBE\u0BB2\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BC1 \u0B8E\u0B99\u0BCD\u0B95\u0BC7 \u0B8E\u0BA4\u0BC1 \u0B8E\u0BA4\u0BC8 \u0B8E\u0BA8\u0BCD\u0BA4 \u0B8E\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF \u0B8E\u0BB5\u0BB0\u0BCD \u0B8E\u0BB5\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BB5\u0BB3\u0BCD \u0B8E\u0BB5\u0BA9\u0BCD \u0B8E\u0BB5\u0BC8 \u0B8E\u0BB5\u0BCD\u0BB5\u0BB3\u0BB5\u0BC1 \u0B8E\u0BA9\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0BA9\u0BA4\u0BC1 \u0B8E\u0BA9\u0BB5\u0BC7 \u0B8E\u0BA9\u0BCD \u0B8E\u0BA9\u0BCD\u0BA9 \u0B8E\u0BA9\u0BCD\u0BA9\u0BBE\u0BB2\u0BCD \u0B8F\u0BA4\u0BC1 \u0B8F\u0BA9\u0BCD \u0BA4\u0BA9\u0BA4\u0BC1 \u0BA4\u0BA9\u0BCD\u0BA9\u0BBE\u0BB2\u0BCD \u0BA4\u0BBE\u0BA9\u0BC7 \u0BA4\u0BBE\u0BA9\u0BCD \u0BA8\u0BBE\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BA8\u0BBE\u0BAE\u0BCD \u0BA8\u0BBE\u0BA9\u0BCD \u0BA8\u0BC0 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD".split(" ")),e.ta.stemmer=function(){return function(t){return typeof t.update=="function"?t.update(function(i){return i}):t}}();var r=e.wordcut;r.init(),e.ta.tokenizer=function(t){if(!arguments.length||t==null||t==null)return[];if(Array.isArray(t))return t.map(function(u){return isLunr2?new e.Token(u.toLowerCase()):u.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}})});export default o(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.ta.js: 5 | (*! 6 | * Lunr languages, `Tamil` language 7 | * https://github.com/tvmani/lunr-languages 8 | * 9 | * Copyright 2021, Manikandan Venkatasubban 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.ta-AKIPBQLC.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.ta-KO56CLDU.min.js: -------------------------------------------------------------------------------- 1 | import{b as s}from"./chunk-XUHMPXWX.min.js";var o=s((n,a)=>{(function(e,r){typeof define=="function"&&define.amd?define(r):typeof n=="object"?a.exports=r():r()(e.lunr)})(n,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="\u0B80-\u0B89\u0B8A-\u0B8F\u0B90-\u0B99\u0B9A-\u0B9F\u0BA0-\u0BA9\u0BAA-\u0BAF\u0BB0-\u0BB9\u0BBA-\u0BBF\u0BC0-\u0BC9\u0BCA-\u0BCF\u0BD0-\u0BD9\u0BDA-\u0BDF\u0BE0-\u0BE9\u0BEA-\u0BEF\u0BF0-\u0BF9\u0BFA-\u0BFFa-zA-Z\uFF41-\uFF5A\uFF21-\uFF3A0-9\uFF10-\uFF19",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("\u0B85\u0B99\u0BCD\u0B95\u0BC1 \u0B85\u0B99\u0BCD\u0B95\u0BC7 \u0B85\u0BA4\u0BC1 \u0B85\u0BA4\u0BC8 \u0B85\u0BA8\u0BCD\u0BA4 \u0B85\u0BB5\u0BB0\u0BCD \u0B85\u0BB5\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B85\u0BB5\u0BB3\u0BCD \u0B85\u0BB5\u0BA9\u0BCD \u0B85\u0BB5\u0BC8 \u0B86\u0B95 \u0B86\u0B95\u0BB5\u0BC7 \u0B86\u0B95\u0BC8\u0BAF\u0BBE\u0BB2\u0BCD \u0B86\u0BA4\u0BB2\u0BBE\u0BB2\u0BCD \u0B86\u0BA4\u0BB2\u0BBF\u0BA9\u0BBE\u0BB2\u0BCD \u0B86\u0BA9\u0BBE\u0BB2\u0BC1\u0BAE\u0BCD \u0B86\u0BA9\u0BBE\u0BB2\u0BCD \u0B87\u0B99\u0BCD\u0B95\u0BC1 \u0B87\u0B99\u0BCD\u0B95\u0BC7 \u0B87\u0BA4\u0BC1 \u0B87\u0BA4\u0BC8 \u0B87\u0BA8\u0BCD\u0BA4 \u0B87\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF \u0B87\u0BB5\u0BB0\u0BCD \u0B87\u0BB5\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B87\u0BB5\u0BB3\u0BCD \u0B87\u0BB5\u0BA9\u0BCD \u0B87\u0BB5\u0BC8 \u0B87\u0BB5\u0BCD\u0BB5\u0BB3\u0BB5\u0BC1 \u0B89\u0BA9\u0B95\u0BCD\u0B95\u0BC1 \u0B89\u0BA9\u0BA4\u0BC1 \u0B89\u0BA9\u0BCD \u0B89\u0BA9\u0BCD\u0BA9\u0BBE\u0BB2\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BC1 \u0B8E\u0B99\u0BCD\u0B95\u0BC7 \u0B8E\u0BA4\u0BC1 \u0B8E\u0BA4\u0BC8 \u0B8E\u0BA8\u0BCD\u0BA4 \u0B8E\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF \u0B8E\u0BB5\u0BB0\u0BCD \u0B8E\u0BB5\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BB5\u0BB3\u0BCD \u0B8E\u0BB5\u0BA9\u0BCD \u0B8E\u0BB5\u0BC8 \u0B8E\u0BB5\u0BCD\u0BB5\u0BB3\u0BB5\u0BC1 \u0B8E\u0BA9\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0BA9\u0BA4\u0BC1 \u0B8E\u0BA9\u0BB5\u0BC7 \u0B8E\u0BA9\u0BCD \u0B8E\u0BA9\u0BCD\u0BA9 \u0B8E\u0BA9\u0BCD\u0BA9\u0BBE\u0BB2\u0BCD \u0B8F\u0BA4\u0BC1 \u0B8F\u0BA9\u0BCD \u0BA4\u0BA9\u0BA4\u0BC1 \u0BA4\u0BA9\u0BCD\u0BA9\u0BBE\u0BB2\u0BCD \u0BA4\u0BBE\u0BA9\u0BC7 \u0BA4\u0BBE\u0BA9\u0BCD \u0BA8\u0BBE\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BA8\u0BBE\u0BAE\u0BCD \u0BA8\u0BBE\u0BA9\u0BCD \u0BA8\u0BC0 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD".split(" ")),e.ta.stemmer=function(){return function(t){return typeof t.update=="function"?t.update(function(i){return i}):t}}();var r=e.wordcut;r.init(),e.ta.tokenizer=function(t){if(!arguments.length||t==null||t==null)return[];if(Array.isArray(t))return t.map(function(u){return isLunr2?new e.Token(u.toLowerCase()):u.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}})});export default o(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.ta.js: 5 | (*! 6 | * Lunr languages, `Tamil` language 7 | * https://github.com/tvmani/lunr-languages 8 | * 9 | * Copyright 2021, Manikandan Venkatasubban 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.ta-KO56CLDU.min.js.map 23 | -------------------------------------------------------------------------------- /docs/public/lunr.ta-OWB7AURB.min.js: -------------------------------------------------------------------------------- 1 | import{a as s}from"./chunk-OSRY5VT3.min.js";var o=s((n,a)=>{(function(e,r){typeof define=="function"&&define.amd?define(r):typeof n=="object"?a.exports=r():r()(e.lunr)})(n,function(){return function(e){if(typeof e>"u")throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(typeof e.stemmerSupport>"u")throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="\u0B80-\u0B89\u0B8A-\u0B8F\u0B90-\u0B99\u0B9A-\u0B9F\u0BA0-\u0BA9\u0BAA-\u0BAF\u0BB0-\u0BB9\u0BBA-\u0BBF\u0BC0-\u0BC9\u0BCA-\u0BCF\u0BD0-\u0BD9\u0BDA-\u0BDF\u0BE0-\u0BE9\u0BEA-\u0BEF\u0BF0-\u0BF9\u0BFA-\u0BFFa-zA-Z\uFF41-\uFF5A\uFF21-\uFF3A0-9\uFF10-\uFF19",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("\u0B85\u0B99\u0BCD\u0B95\u0BC1 \u0B85\u0B99\u0BCD\u0B95\u0BC7 \u0B85\u0BA4\u0BC1 \u0B85\u0BA4\u0BC8 \u0B85\u0BA8\u0BCD\u0BA4 \u0B85\u0BB5\u0BB0\u0BCD \u0B85\u0BB5\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B85\u0BB5\u0BB3\u0BCD \u0B85\u0BB5\u0BA9\u0BCD \u0B85\u0BB5\u0BC8 \u0B86\u0B95 \u0B86\u0B95\u0BB5\u0BC7 \u0B86\u0B95\u0BC8\u0BAF\u0BBE\u0BB2\u0BCD \u0B86\u0BA4\u0BB2\u0BBE\u0BB2\u0BCD \u0B86\u0BA4\u0BB2\u0BBF\u0BA9\u0BBE\u0BB2\u0BCD \u0B86\u0BA9\u0BBE\u0BB2\u0BC1\u0BAE\u0BCD \u0B86\u0BA9\u0BBE\u0BB2\u0BCD \u0B87\u0B99\u0BCD\u0B95\u0BC1 \u0B87\u0B99\u0BCD\u0B95\u0BC7 \u0B87\u0BA4\u0BC1 \u0B87\u0BA4\u0BC8 \u0B87\u0BA8\u0BCD\u0BA4 \u0B87\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF \u0B87\u0BB5\u0BB0\u0BCD \u0B87\u0BB5\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B87\u0BB5\u0BB3\u0BCD \u0B87\u0BB5\u0BA9\u0BCD \u0B87\u0BB5\u0BC8 \u0B87\u0BB5\u0BCD\u0BB5\u0BB3\u0BB5\u0BC1 \u0B89\u0BA9\u0B95\u0BCD\u0B95\u0BC1 \u0B89\u0BA9\u0BA4\u0BC1 \u0B89\u0BA9\u0BCD \u0B89\u0BA9\u0BCD\u0BA9\u0BBE\u0BB2\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BC1 \u0B8E\u0B99\u0BCD\u0B95\u0BC7 \u0B8E\u0BA4\u0BC1 \u0B8E\u0BA4\u0BC8 \u0B8E\u0BA8\u0BCD\u0BA4 \u0B8E\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF \u0B8E\u0BB5\u0BB0\u0BCD \u0B8E\u0BB5\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BB5\u0BB3\u0BCD \u0B8E\u0BB5\u0BA9\u0BCD \u0B8E\u0BB5\u0BC8 \u0B8E\u0BB5\u0BCD\u0BB5\u0BB3\u0BB5\u0BC1 \u0B8E\u0BA9\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0BA9\u0BA4\u0BC1 \u0B8E\u0BA9\u0BB5\u0BC7 \u0B8E\u0BA9\u0BCD \u0B8E\u0BA9\u0BCD\u0BA9 \u0B8E\u0BA9\u0BCD\u0BA9\u0BBE\u0BB2\u0BCD \u0B8F\u0BA4\u0BC1 \u0B8F\u0BA9\u0BCD \u0BA4\u0BA9\u0BA4\u0BC1 \u0BA4\u0BA9\u0BCD\u0BA9\u0BBE\u0BB2\u0BCD \u0BA4\u0BBE\u0BA9\u0BC7 \u0BA4\u0BBE\u0BA9\u0BCD \u0BA8\u0BBE\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BA8\u0BBE\u0BAE\u0BCD \u0BA8\u0BBE\u0BA9\u0BCD \u0BA8\u0BC0 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD".split(" ")),e.ta.stemmer=function(){return function(t){return typeof t.update=="function"?t.update(function(i){return i}):t}}();var r=e.wordcut;r.init(),e.ta.tokenizer=function(t){if(!arguments.length||t==null||t==null)return[];if(Array.isArray(t))return t.map(function(u){return isLunr2?new e.Token(u.toLowerCase()):u.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}})});export default o(); 2 | /*! Bundled license information: 3 | 4 | lunr-languages/lunr.ta.js: 5 | (*! 6 | * Lunr languages, `Tamil` language 7 | * https://github.com/tvmani/lunr-languages 8 | * 9 | * Copyright 2021, Manikandan Venkatasubban 10 | * http://www.mozilla.org/MPL/ 11 | *) 12 | (*! 13 | * based on 14 | * Snowball JavaScript Library v0.3 15 | * http://code.google.com/p/urim/ 16 | * http://snowball.tartarus.org/ 17 | * 18 | * Copyright 2010, Oleg Mazko 19 | * http://www.mozilla.org/MPL/ 20 | *) 21 | */ 22 | //# sourceMappingURL=lunr.ta-OWB7AURB.min.js.map 23 | -------------------------------------------------------------------------------- /src/VirtualizingWrapPanelPerformanceTest/BasisPerformanceTest.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using System.Windows.Controls; 3 | using WpfToolkit.Controls; 4 | using Xunit.Abstractions; 5 | 6 | namespace VirtualizingWrapPanelTest.PerformanceTests; 7 | 8 | public class BasisPerformanceTest(ITestOutputHelper testOutputHelper) 9 | { 10 | // TODO find a way to get more reliable results 11 | 12 | [WpfTheory] 13 | [InlineData(VirtualizationCacheLengthUnit.Item, 10, false, 15)] 14 | [InlineData(VirtualizationCacheLengthUnit.Item, 10, true, 100)] 15 | [InlineData(VirtualizationCacheLengthUnit.Page, 1, false, 15)] 16 | [InlineData(VirtualizationCacheLengthUnit.Page, 1, true, 90)] 17 | [InlineData(VirtualizationCacheLengthUnit.Pixel, 200, false, 15)] 18 | [InlineData(VirtualizationCacheLengthUnit.Pixel, 200, true, 70)] 19 | public void SetVerticalOffset(VirtualizationCacheLengthUnit cacheUnit, int cacheLength, bool allowDifferentSizedItems, int maxAllowedAvgMilliseconds) 20 | { 21 | VirtualizingWrapPanel vwp = TestUtil.CreateVirtualizingWrapPanel(500, 500, 1_000_000); 22 | VirtualizingPanel.SetVirtualizationMode(vwp.ItemsControl, VirtualizationMode.Recycling); 23 | VirtualizingPanel.SetCacheLengthUnit(vwp.ItemsControl, cacheUnit); 24 | VirtualizingPanel.SetCacheLength(vwp.ItemsControl, new VirtualizationCacheLength(cacheLength)); 25 | vwp.AllowDifferentSizedItems = allowDifferentSizedItems; 26 | vwp.UpdateLayout(); 27 | 28 | int maxVerticaOffset = CalculateMaxVerticalOffset(vwp); 29 | 30 | int iterations = 50; 31 | 32 | Stopwatch sw = Stopwatch.StartNew(); 33 | 34 | for (int i = 0; i < iterations; i++) 35 | { 36 | vwp.SetVerticalOffset(Random.Shared.Next(maxVerticaOffset)); 37 | vwp.InvalidateMeasure(); 38 | vwp.UpdateLayout(); 39 | } 40 | 41 | sw.Stop(); 42 | 43 | double avgTime = Math.Round(sw.Elapsed.TotalMilliseconds / iterations); 44 | 45 | testOutputHelper.WriteLine($"Average time was {avgTime}ms"); 46 | 47 | Assert.True(avgTime <= maxAllowedAvgMilliseconds, $"Average time was {avgTime}ms, but should be less than or equal to {maxAllowedAvgMilliseconds}ms."); 48 | } 49 | 50 | 51 | [WpfTheory] 52 | [InlineData(false, 10)] 53 | [InlineData(true, 300)] 54 | public void RemoveItemFromItemsSource(bool allowDifferentSizedItems, int maxAllowedAvgMilliseconds) 55 | { 56 | var items = TestUtil.GenerateItems(1_000_000); 57 | VirtualizingWrapPanel vwp = TestUtil.CreateVirtualizingWrapPanel(500, 500, items); 58 | vwp.AllowDifferentSizedItems = allowDifferentSizedItems; 59 | vwp.UpdateLayout(); 60 | 61 | int maxVerticaOffset = CalculateMaxVerticalOffset(vwp); 62 | vwp.SetVerticalOffset(maxVerticaOffset); 63 | vwp.UpdateLayout(); 64 | 65 | int iterations = 10; 66 | 67 | Stopwatch sw = Stopwatch.StartNew(); 68 | 69 | for (int i = 0; i < iterations; i++) 70 | { 71 | items.RemoveAt(Random.Shared.Next(items.Count)); 72 | vwp.UpdateLayout(); 73 | } 74 | 75 | sw.Stop(); 76 | 77 | double avgTime = Math.Round(sw.Elapsed.TotalMilliseconds / iterations); 78 | 79 | testOutputHelper.WriteLine($"Average time was {avgTime}ms"); 80 | 81 | Assert.True(avgTime <= maxAllowedAvgMilliseconds, $"Average time was {avgTime}ms, but should be less than or equal to {maxAllowedAvgMilliseconds}ms."); 82 | } 83 | 84 | private static int CalculateMaxVerticalOffset(VirtualizingWrapPanel vwp) 85 | { 86 | int itemsPerRow = (int)Math.Floor(vwp.ItemsControl.ActualWidth / TestUtil.DefaultItemWidth); 87 | int rowCount = (int)Math.Ceiling((double)vwp.ItemsControl.Items.Count / itemsPerRow); 88 | int maxVerticaOffset = rowCount * TestUtil.DefaultItemHeight - TestUtil.DefaultItemHeight; 89 | return maxVerticaOffset; 90 | } 91 | } 92 | 93 | -------------------------------------------------------------------------------- /docs/public/diagram-QW4FP2JN-UOF7FAFC.min.js: -------------------------------------------------------------------------------- 1 | import{a as T}from"./chunk-5IIW54K6.min.js";import{a as D}from"./chunk-EKP7MBOP.min.js";import{a as A}from"./chunk-WXIN66R4.min.js";import"./chunk-33FU46FA.min.js";import"./chunk-OZ2RCKQJ.min.js";import"./chunk-PDS7545E.min.js";import"./chunk-IJ4BRSPX.min.js";import"./chunk-UEFJDIUO.min.js";import"./chunk-BIJFJY5F.min.js";import"./chunk-U4DUTLYF.min.js";import"./chunk-IQQ46AC6.min.js";import{l as v}from"./chunk-PYPO7LRM.min.js";import"./chunk-CM5D5KZN.min.js";import{D as $,O as y,S as w,T as B,U as S,V as F,W as z,X as P,Y as W,h as n,j as m,v as C}from"./chunk-U3SD26FK.min.js";import"./chunk-CXRPJJJE.min.js";import"./chunk-OSRY5VT3.min.js";var E={packet:[]},x=structuredClone(E),L=C.packet,Y=n(()=>{let t=v({...L,...$().packet});return t.showBits&&(t.paddingY+=10),t},"getConfig"),I=n(()=>x.packet,"getPacket"),M=n(t=>{t.length>0&&x.packet.push(t)},"pushWord"),O=n(()=>{w(),x=structuredClone(E)},"clear"),h={pushWord:M,getPacket:I,getConfig:Y,clear:O,setAccTitle:B,getAccTitle:S,setDiagramTitle:P,getDiagramTitle:W,getAccDescription:z,setAccDescription:F},G=1e4,H=n(t=>{D(t,h);let e=-1,o=[],i=1,{bitsPerRow:s}=h.getConfig();for(let{start:a,end:r,label:p}of t.blocks){if(r&&r{if(t.end===void 0&&(t.end=t.start),t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);return t.end+1<=e*o?[t,void 0]:[{start:t.start,end:e*o-1,label:t.label},{start:e*o,end:t.end,label:t.label}]},"getNextFittingBlock"),R={parse:n(async t=>{let e=await A("packet",t);m.debug(e),H(e)},"parse")},U=n((t,e,o,i)=>{let s=i.db,a=s.getConfig(),{rowHeight:r,paddingY:p,bitWidth:b,bitsPerRow:c}=a,u=s.getPacket(),l=s.getDiagramTitle(),g=r+p,d=g*(u.length+1)-(l?0:r),k=b*c+2,f=T(e);f.attr("viewbox",`0 0 ${k} ${d}`),y(f,d,k,a.useMaxWidth);for(let[_,N]of u.entries())X(f,N,_,a);f.append("text").text(l).attr("x",k/2).attr("y",d-g/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),X=n((t,e,o,{rowHeight:i,paddingX:s,paddingY:a,bitWidth:r,bitsPerRow:p,showBits:b})=>{let c=t.append("g"),u=o*(i+a)+a;for(let l of e){let g=l.start%p*r+1,d=(l.end-l.start+1)*r-s;if(c.append("rect").attr("x",g).attr("y",u).attr("width",d).attr("height",i).attr("class","packetBlock"),c.append("text").attr("x",g+d/2).attr("y",u+i/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(l.label),!b)continue;let k=l.end===l.start,f=u-2;c.append("text").attr("x",g+(k?d/2:0)).attr("y",f).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",k?"middle":"start").text(l.start),k||c.append("text").attr("x",g+d).attr("y",f).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(l.end)}},"drawWord"),j={draw:U},q={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},J=n(({packet:t}={})=>{let e=v(q,t);return` 2 | .packetByte { 3 | font-size: ${e.byteFontSize}; 4 | } 5 | .packetByte.start { 6 | fill: ${e.startByteColor}; 7 | } 8 | .packetByte.end { 9 | fill: ${e.endByteColor}; 10 | } 11 | .packetLabel { 12 | fill: ${e.labelColor}; 13 | font-size: ${e.labelFontSize}; 14 | } 15 | .packetTitle { 16 | fill: ${e.titleColor}; 17 | font-size: ${e.titleFontSize}; 18 | } 19 | .packetBlock { 20 | stroke: ${e.blockStrokeColor}; 21 | stroke-width: ${e.blockStrokeWidth}; 22 | fill: ${e.blockFillColor}; 23 | } 24 | `},"styles"),at={parser:R,db:h,renderer:j,styles:J};export{at as diagram}; 25 | //# sourceMappingURL=diagram-QW4FP2JN-UOF7FAFC.min.js.map 26 | --------------------------------------------------------------------------------