├── 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 |
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 |
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 |
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 | [](https://www.nuget.org/packages/VirtualizingWrapPanel)
2 | [
](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 |
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