diff --git a/.github/KnowledgeBase/Index.md b/.github/KnowledgeBase/Index.md
index fe15f721..709f1bd4 100644
--- a/.github/KnowledgeBase/Index.md
+++ b/.github/KnowledgeBase/Index.md
@@ -136,6 +136,11 @@ Detailed project guidance: [Index_GacUI.md](./Index_GacUI.md)
- [Using Streams](./manual/vlppos/using-streams.md)
- [Using Threads and Locks](./manual/vlppos/using-threads.md)
+- [Using Inter-Process Channels](./manual/vlppos/using-inter-process.md)
+
+## Vlpp Reflection
+
+- [Registration Macros and Attributes](./manual/vlppreflection/registration-macros.md)
## Vlpp Parser2
@@ -188,6 +193,9 @@ Detailed project guidance: [Index_GacUI.md](./Index_GacUI.md)
- [Example: Calculator](./manual/workflow/lang/state_calculator.md)
- [Index of Keywords](./manual/workflow/lang/index.md)
- [Index of Errors](./manual/workflow/lang/error.md)
+- [Attributes](./manual/workflow/attributes.md)
+- [RPC](./manual/workflow/rpc.md)
+ - [JSON RPC Channel Setup](./manual/workflow/rpc/json-channel.md)
- [Runtime Instructions](./manual/workflow/ins.md)
- [C++ Code Generation](./manual/workflow/codegen.md)
@@ -331,7 +339,20 @@ Detailed project guidance: [Index_GacUI.md](./Index_GacUI.md)
- [Hosted Mode and Remote Protocol](./manual/gacui/modes/home.md)
- [Remote Protocol Core Application](./manual/gacui/modes/remote_core.md)
- [Remote Protocol Client Application](./manual/gacui/modes/remote_client.md)
- - [Implementing a Communication Protocol](./manual/gacui/modes/remote_communication.md)
+ - [Remote Protocol Channel Layer](./manual/gacui/modes/remote_communication.md)
+- Coding Agent Supports
+ - [AutomationService](./manual/gacui/coding-agent/automation-service.md)
+
+## Working with Coding Agent
+
+- Installing required tools
+ - [Windows](./manual/coding-agent/installing/windows.md)
+ - [Linux](./manual/coding-agent/installing/linux.md)
+ - [macOS](./manual/coding-agent/installing/macos.md)
+- [Preparing Context Files](./manual/coding-agent/context.md)
+ - [Writing Project.md](./manual/coding-agent/project-md.md)
+- [Investigate and Refine Jobs](./manual/coding-agent/jobs.md)
+- [AutomationService and Basic Computer Use](./manual/coding-agent/gacui-debugging.md)
## Unit Testing
diff --git a/.github/KnowledgeBase/manual/coding-agent/context.md b/.github/KnowledgeBase/manual/coding-agent/context.md
new file mode 100644
index 00000000..4c664c77
--- /dev/null
+++ b/.github/KnowledgeBase/manual/coding-agent/context.md
@@ -0,0 +1,22 @@
+# Preparing Context Files
+
+Copy the coding-agent context from the Release repository into the root of the application repository. The minimum copied set is:
+- `.github`: prompts, guidelines, scripts, Linux build helpers, local learning files, task-log files, and the copied knowledge base.
+- `AGENTS.md`: common entry instructions used by Codex and other agents that read this file.
+- `CLAUDE.md`: the same entry instructions for Claude-style agents.
+- `Project.md`: application-specific repository map and verification policy, written by the application owner.
+
+The copied `.github` folder contains several kinds of files:
+- `copilot-instructions.md`: the main instruction file. It tells the agent to read `Project.md`, use the knowledge base, and prefer provided scripts.
+- `Guidelines`: build, run, debug, source-file, coding, and GacUI resource instructions.
+- `prompts`: job prompts such as `ask.prompt.md`, `investigate.prompt.md`, `refine.prompt.md`, and `kb.prompt.md`.
+- `Scripts`: Windows PowerShell wrappers for building, executing, debugging, and archiving task logs.
+- `Ubuntu`: Linux build wrapper and helper commands.
+- `KnowledgeBase`: copied API, design, manual, and learning documents that the agent can read without network access.
+- `Learning`: project-local lessons that refine future agent behavior.
+- `TaskLogs`: working documents for investigation and knowledge-base jobs.
+
+Keep the copied context files under source control when they describe stable project behavior. Task-log files may be tracked or ignored according to the repository policy, but the files referenced by the prompts should exist before asking the agent to use those prompts. If the application has different build scripts, test commands, project names, generated files, or platform support, update `Project.md` first.
+
+See [Writing Project.md](.././coding-agent/project-md.md) for the expected contents of the application-specific file.
+
diff --git a/.github/KnowledgeBase/manual/coding-agent/gacui-debugging.md b/.github/KnowledgeBase/manual/coding-agent/gacui-debugging.md
new file mode 100644
index 00000000..932171fb
--- /dev/null
+++ b/.github/KnowledgeBase/manual/coding-agent/gacui-debugging.md
@@ -0,0 +1,28 @@
+# AutomationService and Basic Computer Use
+
+GacUI applications need an application-level automation path so a coding agent can inspect and operate the UI while debugging. On Windows, the recommended path is to start the GacUI AutomationService HTTP endpoint from the application during startup. This lets the agent read the control tree or remote-renderer DOM and send IO commands without using operating-system UI Automation.
+
+From the agent user's perspective, this means:
+- The application should expose a stable localhost automation URL while it is running.
+- The agent should use the automation endpoint for normal GacUI windows and controls.
+- The agent should not rely on UI Automation as a fallback, because it can fail when the screen is locked.
+- The user can keep using the computer because the agent does not need to drive the physical pointer for normal GacUI operations.
+
+See [AutomationService](.././gacui/coding-agent/automation-service.md) for the service setup, exact HTTP URLs, setup-function cases, and platform implementation details.
+
+## When the Agent Gets Blocked
+
+Application-level automation depends on the application UI thread. A native crash dialog, message box, file dialog, color dialog, or another modal native window can block that thread. When this happens, the agent should stop polling the application automation endpoint and inspect native windows from another process.
+
+The copied `.github/Guidelines/Running-ComputerUse.md` file explains the unblocking workflow:
+- Identify the target process.
+- Enumerate top-level and child windows with Win32 APIs.
+- Read class names, window text, control ids, and rectangles.
+- Prefer direct control messages such as `BM_CLICK`, `WM_SETTEXT`, and combo-box messages.
+- Capture a screenshot only when visual confirmation is needed.
+- Close or answer the native dialog before returning to AutomationService.
+
+## Project Preparation
+
+If the application contains GacUI UI work, mention its automation endpoint in `Project.md`. Include the executable project name, port, URL prefix, whether hosted mode is used, and any native dialogs that commonly appear. This gives the agent enough context to choose AutomationService first and native-window handling only when the application is blocked.
+
diff --git a/.github/KnowledgeBase/manual/coding-agent/installing/linux.md b/.github/KnowledgeBase/manual/coding-agent/installing/linux.md
new file mode 100644
index 00000000..2948dd30
--- /dev/null
+++ b/.github/KnowledgeBase/manual/coding-agent/installing/linux.md
@@ -0,0 +1,20 @@
+# Installing Required Tools on Linux
+
+The Linux agent workflow is driven by `.github/Ubuntu/build.sh`. It adds `.github/Ubuntu/vl/cmd` to `PATH`, runs `vmake --make`, and then builds with `vbuild`. The agent instructions deliberately route builds through this script instead of direct `cmake`, `make`, `clang++`, `g++`, or `gdb` calls.
+
+Prepare a Linux environment with a C++ compiler toolchain, Bash, and LLDB. After copying the Release `.github` folder, make the copied scripts executable if the checkout blocks execution bits:
+```bash
+chmod +x .github/Ubuntu/build.sh
+chmod +x .github/Ubuntu/vl/cmd/*
+```
+
+Build from the folder that contains the target `vmake` file:
+- For a repository with one Linux project, use `REPO-ROOT/Test/Linux`.
+- For a repository with multiple Linux projects, use `REPO-ROOT/Test/Linux/PROJECT-NAME`.
+- Run `REPO-ROOT/.github/Ubuntu/build.sh` for an incremental build.
+- Run `REPO-ROOT/.github/Ubuntu/build.sh -f` for a full rebuild.
+
+Linux debug work should use `lldb` in an interactive terminal session. The copied guidelines expect the agent to start LLDB from the same folder that contains the `vmake` file so relative paths to binaries and source files remain correct.
+
+If the application uses Release tools, run `Release/Tools/BuildExecutables.sh` in the Release repository. It produces `CodePack`, `CppMerge`, `GacGen`, and `GlrParserGen` under `Release/Tools`.
+
diff --git a/.github/KnowledgeBase/manual/coding-agent/installing/macos.md b/.github/KnowledgeBase/manual/coding-agent/installing/macos.md
new file mode 100644
index 00000000..77321f4e
--- /dev/null
+++ b/.github/KnowledgeBase/manual/coding-agent/installing/macos.md
@@ -0,0 +1,4 @@
+# Installing Required Tools on macOS
+
+(to be editing...)
+
diff --git a/.github/KnowledgeBase/manual/coding-agent/installing/windows.md b/.github/KnowledgeBase/manual/coding-agent/installing/windows.md
new file mode 100644
index 00000000..e53ccbe7
--- /dev/null
+++ b/.github/KnowledgeBase/manual/coding-agent/installing/windows.md
@@ -0,0 +1,21 @@
+# Installing Required Tools on Windows
+
+The Windows agent scripts build with MSBuild through Visual Studio's developer environment and debug with CDB. Install Visual Studio with the C++ desktop workload, a Windows SDK, and the Windows debugging tools that provide `cdb.exe`. If CDB is not available, install the Windows Driver Kit or the Windows debugging tools component from the Visual Studio Installer.
+
+Define these environment variables before asking the agent to build or debug:
+- `VLPP_VSDEVCMD_PATH`: absolute path to `VsDevCmd.bat`, for example `C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat`.
+- `CDBPATH`: absolute path to `cdb.exe`, for example `C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe`.
+
+After copying the Release `.github` folder, the agent should use these scripts instead of calling tools directly:
+- `.github\Scripts\copilotBuild.ps1`: builds the solution found from `Project.md` context and writes `Build.log`.
+- `.github\Scripts\copilotExecute.ps1`: runs unit-test or CLI projects and writes `Execute.log` for unit tests.
+- `.github\Scripts\copilotDebug_Start.ps1` and `copilotDebug_RunCommand.ps1`: start CDB and send debugger commands.
+
+If the application uses the tools shipped by Release, build them from the Release repository:
+- Open `Tools\Executables\Executables.sln` in Visual Studio.
+- Build `Release` with `x64`.
+- Run `Tools\CopyExecutables.ps1`.
+- Confirm `CodePack.exe`, `CppMerge.exe`, `GacGen.exe`, and `GlrParserGen.exe` exist in `Release\Tools`.
+
+For debugger readability, copy `Import\vlpp.natvis` from Release to Visual Studio's visualizers folder. The CDB startup script also loads the natvis file for debugger commands such as `dx`.
+
diff --git a/.github/KnowledgeBase/manual/coding-agent/jobs.md b/.github/KnowledgeBase/manual/coding-agent/jobs.md
new file mode 100644
index 00000000..2a1e69c6
--- /dev/null
+++ b/.github/KnowledgeBase/manual/coding-agent/jobs.md
@@ -0,0 +1,28 @@
+# Investigate and Refine Jobs
+
+`AGENTS.md` and `CLAUDE.md` route short request keywords to prompt files in `.github/prompts`. These jobs make agent work repeatable because the agent writes durable task documents, uses the copied knowledge base, and follows the repository's build and debug scripts.
+
+## investigate
+
+Use `investigate` for coding work that needs analysis, implementation, verification, and a record of decisions. It is not limited to bug fixing. It can handle new features, refactoring, behavior changes, regressions, and deep research that may end in source edits.
+
+Common request forms are:
+- `investigate repro ...`: start a fresh task and copy the problem or feature request into `Copilot_Investigate.md`.
+- `investigate continue ...`: append an update to the current investigation and continue from the existing proposals.
+- `investigate report ...`: ask the agent to summarize confirmed proposals and tradeoffs.
+
+The job writes `.github/TaskLogs/Copilot_Investigate.md`. It records the problem description, tests or confirmation criteria, proposed solutions, code changes, and confirmation or denial for each proposal. The prompt expects the agent to build, run tests, and debug when needed.
+
+## refine
+
+Use `refine` after completed work has produced task logs that contain reusable lessons. The job reads archived task documents, extracts user preferences and project-specific lessons, and writes them to:
+- `.github/KnowledgeBase/Learning.md`: general learnings across projects.
+- `.github/Learning/Learning_Coding.md`: source-code learnings for this repository.
+- `.github/Learning/Learning_Testing.md`: test-code and verification learnings for this repository.
+
+The refine job is intentionally document-only. It should not modify source code. It is useful when a correction, review discussion, or debugging result should influence future agent behavior.
+
+## Other Keywords
+
+The copied context also includes `ask` for analysis-only questions and `kb` for drafting or updating knowledge-base documents. If a user request does not start with a known keyword, the root instructions classify ordinary coding work as an `investigate repro` style task.
+
diff --git a/.github/KnowledgeBase/manual/coding-agent/project-md.md b/.github/KnowledgeBase/manual/coding-agent/project-md.md
new file mode 100644
index 00000000..837fe898
--- /dev/null
+++ b/.github/KnowledgeBase/manual/coding-agent/project-md.md
@@ -0,0 +1,64 @@
+# Writing Project.md
+
+`Project.md` is the repository map that tells the agent where to build, what to run, which generated files are protected, and which platform folders matter. The Release copy only points to the GacUI example; an application repository should replace it with concrete project facts.
+
+## Recommended Shape
+
+A useful `Project.md` usually contains:
+- Solution to work on: the solution file and the meaning of `SOLUTION-ROOT`.
+- Projects for verification: unit-test, CLI, code-generation, metadata, or UI projects that must run after relevant changes.
+- Execution order: required ordering when one project generates files consumed by another project.
+- Files not allowed to modify directly: generated folders, imported dependencies, released binaries, and generated baselines.
+- Code generation triggers: which files require running generators and which outputs they refresh.
+- Platform notes: Linux `Test/Linux` folders, unsupported platforms, special tools, and available configurations.
+- Application-specific debugging notes: services, ports, sample data, dialogs, or local servers that matter for the app.
+
+## Small Application Example
+
+A small GacUI application can use this shape:
+```markdown
+# Project Specific Instruction
+
+## Solution to Work On
+
+You are working on the solution `REPO-ROOT/App/App.sln`,
+therefore `SOLUTION-ROOT` is `REPO-ROOT/App`.
+
+## Projects for Verification
+
+The `REPO-ROOT/App/AppTests/AppTests.vcxproj` project is the unit test project.
+When any `*.h`, `*.cpp`, `*.xml`, or Workflow script file is changed, build the solution
+and run `AppTests`.
+
+The `REPO-ROOT/App/App/App.vcxproj` project is the interactive GacUI application.
+Run it when the change affects windows, dialogs, command routing, or application startup.
+
+## Files not Allowed to Modify
+
+Files in these folders are generated and must not be edited directly:
+- `REPO-ROOT/App/Generated`
+- `REPO-ROOT/App/Resources/Compiled`
+
+Fix the source resource or generator input instead.
+
+## Code Generation
+
+If `REPO-ROOT/App/Resources/*.xml` changes, run `GacGen` through the project build.
+If generated files change, rebuild and run `AppTests`.
+
+## Linux Specific
+
+This repository has no Linux build for the application.
+Do not try to create one unless the task explicitly asks for it.
+```
+
+## Large Repository Patterns
+
+The library repositories use the same idea with more detail:
+- Vlpp, VlppOS, and VlppRegex define one unit-test solution and one Linux folder.
+- VlppReflection adds metadata generation and metadata round-trip tests when reflection types change.
+- VlppParser2 and Workflow list ordered generator and test projects because later projects consume files produced by earlier projects.
+- GacUI lists generated folders, reflection metadata projects, GacUI compiler triggers, remote protocol generation, AutomationService-enabled applications, and Linux project folders.
+
+Use these examples as patterns, not templates to copy blindly. The important part is that every instruction names the exact project, folder, generated output, or trigger that applies to the application repository.
+
diff --git a/.github/KnowledgeBase/manual/gacui/advanced/alt.md b/.github/KnowledgeBase/manual/gacui/advanced/alt.md
index d1af8dd2..e9d71910 100644
--- a/.github/KnowledgeBase/manual/gacui/advanced/alt.md
+++ b/.github/KnowledgeBase/manual/gacui/advanced/alt.md
@@ -1,14 +1,14 @@
# ALT Sequence and Control Focus
-If a focusable control is put on a window, by setting the[Alt](../.././gacui/components/controls/basic/home.md)property to a value, for example "X", then it could get focused by pressing**ALT**followed by**X**(not**ALT+X**).
+If a focusable control is put on a window, by setting the [Alt](../.././gacui/components/controls/basic/home.md) property to a value, for example "X", then it could get focused by pressing **ALT** followed by **X** (not **ALT+X**).
-The**Alt**property could accept a sequence of characters, not just one. Characters in such a sequence needs to be entered to activate this control.
+The **Alt** property could accept a sequence of characters, not just one. Characters in such a sequence needs to be entered to activate this control.
-If**ESC**is pressed, it goes back to the previous container.
+If **ESC** is pressed, it goes back to the previous container.
-If**BACKSPACE**is pressed, it cancels the last character in the sequence.
+If **BACKSPACE** is pressed, it cancels the last character in the sequence.
-When**ALT**is pressed, all valid**ALT**sequences will be printed on the window. All labels rendering these sequences will get changed
+When **ALT** is pressed, all valid **ALT** sequences will be printed on the window. All labels rendering these sequences will get changed
## Example
@@ -16,7 +16,7 @@ When**ALT**is pressed, all valid**ALT**sequences will be printed on the window.
The operation is done by pressing the following keys:
- **ALT**: Enter the ALT sequence mode.
-- **P**: There are two controls with the**Alt**property set to "P". It filters them out and wait for a number key.
+- **P**: There are two controls with the **Alt** property set to "P". It filters them out and wait for a number key.
- **0**: The dropdown button is activated, a sub menu is opened.
- **ESC**: Close the sub menu and go back to the previous container, which is the window.
- **P**: Filter again.
@@ -30,49 +30,49 @@ The operation is done by pressing the following keys:
## Behavior after being Focused
-There are three kinds of behaviors when a control is focused by a**ALT**sequence. If a control is focused by**TAB**, it could behaves differently.
+There are three kinds of behaviors when a control is focused by a **ALT** sequence. If a control is focused by **TAB**, it could behaves differently.
- `empty list item`
**Just being focused**
Controls with complex keyboard behaviors like editors or list controls, will just get focused and do nothing else.
- `empty list item`
**Execute a Command**
- Controls with simple executable behaviors like buttons, will do what it does when clicked, after being focused by an**ALT**sequence.
+ Controls with simple executable behaviors like buttons, will do what it does when clicked, after being focused by an **ALT** sequence.
- `empty list item`
**Just being focused**
- Controls that are not executable but contains executable items, like menu items with a sub menu, will render all executable items after being focused by an**ALT**sequence.
- A menu item with a sub menu does nothing when it is clicked. But if it is activated by an**ALT**sequence, the sub menu will be opened and wait for more keys.
+ Controls that are not executable but contains executable items, like menu items with a sub menu, will render all executable items after being focused by an **ALT** sequence.
+ A menu item with a sub menu does nothing when it is clicked. But if it is activated by an **ALT** sequence, the sub menu will be opened and wait for more keys.
## Create your own Behavior
-If a new control class is created, there are multiple ways to customize the behavior about how a control should react to an**ALT**sequence:
+If a new control class is created, there are multiple ways to customize the behavior about how a control should react to an **ALT** sequence:
### Using IGuiAltAction
-**IGuiAltAction**is a protected base class of all controls. If a new control is created, methods could be overriden.
+**IGuiAltAction** is a protected base class of all controls. If a new control is created, methods could be overriden.
-Properly assigning an**ALT**sequence to the**Alt**property of a control could also make these methods behave as expected easily.**IsAltEnabled**returns**true**if the control is visible and enabled.**IsAltAvailable**returns**true**if the control is focusable and the**Alt**property is not empty.
+Properly assigning an **ALT** sequence to the **Alt** property of a control could also make these methods behave as expected easily. **IsAltEnabled** returns **true** if the control is visible and enabled. **IsAltAvailable** returns **true** if the control is focusable and the **Alt** property is not empty.
-When the window is in the**ALT**sequence mode, a label rendering the sequence for this control will be put in the composition from**GetAltComposition**.
+When the window is in the **ALT** sequence mode, a label rendering the sequence for this control will be put in the composition from **GetAltComposition**.
-If both**IsAltEnabled**and**IsAltAvailable**returns**true**, then the result of**GetAlt()**, which is also the value from the**Alt**property by default, becomes one of an candidate.**OnActiveAlt**will be called when this control is selected by a**ALT**sequence.
+If both **IsAltEnabled** and **IsAltAvailable** returns **true**, then the result of **GetAlt()**, which is also the value from the **Alt** property by default, becomes one of an candidate. **OnActiveAlt** will be called when this control is selected by a **ALT** sequence.
### Using IGuiAltActionContainer
-**IGuiAltActionContainer**is a[service object](../.././gacui/components/controls/basic/home.md). A service object could be attached to a control by calling**AddService**or overriding**QueryService**.
+**IGuiAltActionContainer** is a [service object](../.././gacui/components/controls/basic/home.md). A service object could be attached to a control by calling **AddService** or overriding **QueryService**.
-If an**IGuiAltActionContainer**instance is attached to a control, then all methods in**IGuiAltAction**are ignored. Instead, multiple**IGuiAltAction**object returned from this interface will be used.
+If an **IGuiAltActionContainer** instance is attached to a control, then all methods in **IGuiAltAction** are ignored. Instead, multiple **IGuiAltAction** object returned from this interface will be used.
-You could now assign multiple**ALT**sequence to a control, with each sequence binded to a different behavior.
+You could now assign multiple **ALT** sequence to a control, with each sequence binded to a different behavior.
-All**IGuiAltAction**returned from**IGuiAltActionContainer**must be enabled and available.
+All **IGuiAltAction** returned from **IGuiAltActionContainer** must be enabled and available.
### Using IGuiAltActionHost
-An**IGuiAltActionHost**instance could be attached to a control by calling**SetActivatingAltHost**or overriding**GetActivatingAltHost**.
+An **IGuiAltActionHost** instance could be attached to a control by calling **SetActivatingAltHost** or overriding **GetActivatingAltHost**.
-When a control is selected by a**ALT**sequence, if**IGuiAltActionHost**is attached to this control, then the**ALT**sequence mode will not exit. Instead, this**IGuiAltActionHost**is treated as a nested container, and GacUI calls**CollectAltActions**to collect all valid**IGuiAltAction**, renders all**ALT**and wait for keyboard input.
+When a control is selected by a **ALT** sequence, if **IGuiAltActionHost** is attached to this control, then the **ALT** sequence mode will not exit. Instead, this **IGuiAltActionHost** is treated as a nested container, and GacUI calls **CollectAltActions** to collect all valid **IGuiAltAction**, renders all **ALT** and wait for keyboard input.
-All top level controls like a window or a menu are attached by an**IGuiAltActionHost**by default. If a sub menu is created on a menu item,**IGuiAltActionHost**is attached to this control. So when it is activated, it opens the sub menu and continue to wait for more keys, instead of executing this menu item.
+All top level controls like a window or a menu are attached by an **IGuiAltActionHost** by default. If a sub menu is created on a menu item, **IGuiAltActionHost** is attached to this control. So when it is activated, it opens the sub menu and continue to wait for more keys, instead of executing this menu item.
-**GuiAltActionHostBase**is the default implementation of**IGuiAltActionHost**. If it is attached to a control, all child controls with valid**IGuiAltAction**are not visible from the container, instead they are available when the parent control is selected by an**ALT**sequence.**GuiAltActionHostBase::SetAltControl**must be called to initialize this class, it tells this implementation where to search for child controls to collect**IGuiAltAction**.
+**GuiAltActionHostBase** is the default implementation of **IGuiAltActionHost**. If it is attached to a control, all child controls with valid **IGuiAltAction** are not visible from the container, instead they are available when the parent control is selected by an **ALT** sequence. **GuiAltActionHostBase::SetAltControl** must be called to initialize this class, it tells this implementation where to search for child controls to collect **IGuiAltAction**.
diff --git a/.github/KnowledgeBase/manual/gacui/advanced/animations.md b/.github/KnowledgeBase/manual/gacui/advanced/animations.md
index 2696d6bf..c66a49b8 100644
--- a/.github/KnowledgeBase/manual/gacui/advanced/animations.md
+++ b/.github/KnowledgeBase/manual/gacui/advanced/animations.md
@@ -1,6 +1,6 @@
# Animations
-The GacUI XML[ ](../.././gacui/xmlres/tag_animation.md)resource creates helper classes for animations. It creates a class like this:
+The GacUI XML [ ](../.././gacui/xmlres/tag_animation.md) resource creates helper classes for animations. It creates a class like this:
```
class MyAnimation
{
@@ -9,7 +9,7 @@ class MyAnimation
func CreateAnimation(target: STATE_CLASS^, time: UInt64);
}
```
-**STATE_CLASS**is a class with fields of number types or**Color**. By creating an**MyAnimation^**in a window like this:
+**STATE_CLASS** is a class with fields of number types or **Color**. By creating an **MyAnimation^** in a window like this:
```
```
-You are able to bind the expression**self.myAnimation.Current.FIELD**to any compatible property. When the animation is running, fields in**self.myAnimation.Current**will keep updating, so that to animate the UI.
+ You are able to bind the expression **self.myAnimation.Current.FIELD** to any compatible property. When the animation is running, fields in **self.myAnimation.Current** will keep updating, so that to animate the UI.
## Interpolation Functions
-The first step to animate a field in**self.myAnimation.Current**is to set a proper interpolation function, which is described in[ ](../.././gacui/xmlres/tag_animation.md). Only fields that mentioned by a**\**tag could be animated. All animated fields must associate an interpolation function. There is also a place for a default interpolation function, which will apply on all animated fields unless one is specified in**\**.
+The first step to animate a field in **self.myAnimation.Current** is to set a proper interpolation function, which is described in [ ](../.././gacui/xmlres/tag_animation.md). Only fields that mentioned by a **\** tag could be animated. All animated fields must associate an interpolation function. There is also a place for a default interpolation function, which will apply on all animated fields unless one is specified in **\**.
-An interpolation function is an Workflow expression in a function type, which takes a**double**and returns a**double**.
+An interpolation function is an Workflow expression in a function type, which takes a **double** and returns a **double**.
-The function parameter is the progress of the animation from**0**to**1**. If an animation is 10 seconds long, then**0**is the beginning,**1**is the ending, and**0.4**means**10 seconds * 0.4**which is at the end of the 4th second.
+The function parameter is the progress of the animation from **0** to **1**. If an animation is 10 seconds long, then **0** is the beginning, **1** is the ending, and **0.4** means **10 seconds * 0.4** which is at the end of the 4th second.
-The return value is the interpolation of the animation from**0**to**1**. If the begin state is**5**and the end state is**15**, then returning**0**means**5**, returning**1**means**15**, and returning**0.4**means the**5 + (15 - 5) * 0.4**which is**9**.
+The return value is the interpolation of the animation from **0** to **1**. If the begin state is **5** and the end state is **15**, then returning **0** means **5**, returning **1** means **15**, and returning **0.4** means the **5 + (15 - 5) * 0.4** which is **9**.
The interpolation calculate that, where a field should go given the progress of the animation. If a linear interpolation function is expected, then just return the parameter. Such a function would typically be:
-- for[ordered lambda expression](../.././workflow/lang/expr.md):**[$1]**
-- for[lambda expression](../.././workflow/lang/expr.md): for example:**func (progress: double) : double { return progress; }**Sometimes it is better to make the field accelerate at the first half and decelerate at the second half, such a function could be easily created using:
+- for [ordered lambda expression](../.././workflow/lang/expr.md) : **[$1]**
+- for [lambda expression](../.././workflow/lang/expr.md) : for example: **func (progress: double) : double { return progress; }** Sometimes it is better to make the field accelerate at the first half and decelerate at the second half, such a function could be easily created using:
```
func (x: double): double
{
@@ -42,16 +42,15 @@ func (x: double): double
}
```
-
## Running an Animation
-In the**\**generated class, there is a**CreateAnimation(state, time)**function, which means the animation begins from the current state, and run towards**state**in**time**milliseconds.
+In the **\** generated class, there is a **CreateAnimation(state, time)** function, which means the animation begins from the current state, and run towards **state** in **time** milliseconds.
-Calling this function doesn't make the animation run, instead it returns an**(vl::)presentation::controls::IGuiAnimation^**object.**AddAnimation**and**KillAnimation**of**(vl::)presentation::controls::GuiInstanceRootObject**controls how the animation run. This class is the base class for all UI[root instances](../.././gacui/xmlres/instance/root_instance.md), so**AddAnimation**and**KillAnimation**, or**self.AddAnimation**and**self.KillAnimation**, are accessible in the XML.
+Calling this function doesn't make the animation run, instead it returns an **(vl::)presentation::controls::IGuiAnimation^** object. **AddAnimation** and **KillAnimation** of **(vl::)presentation::controls::GuiInstanceRootObject** controls how the animation run. This class is the base class for all UI [root instances](../.././gacui/xmlres/instance/root_instance.md), so **AddAnimation** and **KillAnimation**, or **self.AddAnimation** and **self.KillAnimation**, are accessible in the XML.
-**AddAnimation**adds an**IGuiAnimation**object to the UI object, and start the animation immediately.
+**AddAnimation** adds an **IGuiAnimation** object to the UI object, and start the animation immediately.
-**KillAnimation**stops an**IGuiAnimation**object that has been added to the UI object, and stop the animation immediately.
+**KillAnimation** stops an **IGuiAnimation** object that has been added to the UI object, and stop the animation immediately.
For animations that need to switch from state to state for multiple times, like a button when the mouse is moving in and out, there is a pattern to control the animation:
```
@@ -65,25 +64,24 @@ KillAnimation(lastAnimation);
lastAnimation = newAnimation;
AddAnimation(lastAnimation);
```
-When the state needs to move to a new state when the animation is running, this piece of code stops the current running animation, and replace it with a new one. The new animation moves the current state from where it is to a new state, and it should look smooth.
+ When the state needs to move to a new state when the animation is running, this piece of code stops the current running animation, and replace it with a new one. The new animation moves the current state from where it is to a new state, and it should look smooth.
-**KillAnimation**could accept**null**, and it does nothing.
+**KillAnimation** could accept **null**, and it does nothing.
## Managing Multiple Animations
It is easy to copy the above pattern multiple times for each animation.
-Please remember that, the created**lastAnimation**will change**myAnimation.Current.FIELD**when it is executing, so if multiple animation needs to run at the same time, multiple**lastAnimation**and**myAnimation**should be created at the same time. Please give them good names to make the code looks clear.
+Please remember that, the created **lastAnimation** will change **myAnimation.Current.FIELD** when it is executing, so if multiple animation needs to run at the same time, multiple **lastAnimation** and **myAnimation** should be created at the same time. Please give them good names to make the code looks clear.
-When a UI object is disposing, e.g. when the close button on a window is clicked, all animations will be shut down, and calling**AddAnimation**will result in an exception.
+When a UI object is disposing, e.g. when the close button on a window is clicked, all animations will be shut down, and calling **AddAnimation** will result in an exception.
It is function idential to split all fields to multiple animation objects. But if multiple fields represent different parts of the same animation, do your best to make one animation for all these fields to increase the performance.
-In[this tutorial project](https://github.com/vczh-libraries/Release/blob/master/SampleForDoc/GacUI/XmlRes/kb_animation/Resource.xml), a button is controlled by 4 colors, which changes in one animation because they represent different parts of the same animation. So only one**\**and only one instance of it is needed for one button.
+In [this tutorial project](https://github.com/vczh-libraries/Release/blob/master/SampleForDoc/GacUI/XmlRes/kb_animation/Resource.xml), a button is controlled by 4 colors, which changes in one animation because they represent different parts of the same animation. So only one **\** and only one instance of it is needed for one button.
Here is how it looks like:
-
-- Source code:[kb_animation](https://github.com/vczh-libraries/Release/blob/master/SampleForDoc/GacUI/XmlRes/kb_animation/Resource.xml)
+- Source code: [kb_animation](https://github.com/vczh-libraries/Release/blob/master/SampleForDoc/GacUI/XmlRes/kb_animation/Resource.xml)
- 
diff --git a/.github/KnowledgeBase/manual/gacui/advanced/bindings.md b/.github/KnowledgeBase/manual/gacui/advanced/bindings.md
index 3d073eca..565c5374 100644
--- a/.github/KnowledgeBase/manual/gacui/advanced/bindings.md
+++ b/.github/KnowledgeBase/manual/gacui/advanced/bindings.md
@@ -1,23 +1,22 @@
# Data Bindings
-Data bindings in GacUI relies on[Workflow expression](../.././workflow/lang/bind.md). Basically, an expression is observable if it uses properties, and these properties must be observable by having their property changing events on the object. You are still able to combine some events on a property temporary just for this expression to make it observable.
+Data bindings in GacUI relies on [Workflow expression](../.././workflow/lang/bind.md). Basically, an expression is observable if it uses properties, and these properties must be observable by having their property changing events on the object. You are still able to combine some events on a property temporary just for this expression to make it observable.
-In GacUI XML Resource,[-bind](../.././gacui/xmlres/instance/properties.md),[-format](../.././gacui/xmlres/instance/properties.md)and[-str](../.././gacui/xmlres/instance/properties.md)are based on data bindings.
+In GacUI XML Resource, [-bind](../.././gacui/xmlres/instance/properties.md), [-format](../.././gacui/xmlres/instance/properties.md) and [-str](../.././gacui/xmlres/instance/properties.md) are based on data bindings.
## Binding to Control Properties
This is the most basic kind of data binding.
-If you are binding something to a text property which will be displayed on the UI, e.g.**Text**of a**\**, make sure that:
+If you are binding something to a text property which will be displayed on the UI, e.g. **Text** of a **\**, make sure that:
- The layout of controls is properly handled, so that they will re-arrange themselves to make sure that no truncation of text rendering will happen.
-- If the application could be send to people using different language, please consider using**Localization**from the very beginning.
+- If the application could be send to people using different language, please consider using **Localization** from the very beginning.
-Binding view models to control is also very straight-forward. A**\**creates a property that will never change once the window is created. The**X**property of**Something**can be binded to a control property just by:
+Binding view models to control is also very straight-forward. A **\** creates a property that will never change once the window is created. The **X** property of **Something** can be binded to a control property just by:
```
```
-
It is also very simple to use data binding with your own objects like:
```
@@ -29,7 +28,7 @@ It is also very simple to use data binding with your own objects like:
```
-Since**myObject**is a member of the window, you must first give the window a name**self**, to make XML knows what is**myObject**.
+ Since **myObject** is a member of the window, you must first give the window a name **self**, to make XML knows what is **myObject**.
## Binding between Composition Properties
@@ -47,18 +46,17 @@ Here is a very bad example:
```
+When **parent.Bounds** is changed, the observed expression is notified to re-evaluate, and than cause **child.PreferredMinSize** to change.
-When**parent.Bounds**is changed, the observed expression is notified to re-evaluate, and than cause**child.PreferredMinSize**to change.
+**child.PreferredMinSize** causes **parent.Bounds** to re-evaluate because **MinSizeLimitation="LimitToElementAndChildren"**.
-**child.PreferredMinSize**causes**parent.Bounds**to re-evaluate because**MinSizeLimitation="LimitToElementAndChildren"**.
+Now parent grows bigger because **child.AlignmentToParent** is not **0** or **-1**, which causes **parent.Bounds** to change again.
-Now parent grows bigger because**child.AlignmentToParent**is not**0**or**-1**, which causes**parent.Bounds**to change again.
-
-The loop is infinite, and when it begins to happen (usually because of the window border is dragging to resize),**parent**will soon grows to super big and you are no longer able to properly operate against the window.
+The loop is infinite, and when it begins to happen (usually because of the window border is dragging to resize), **parent** will soon grows to super big and you are no longer able to properly operate against the window.
## Binding to ViewModel Properties
-You could also bind something back to the view model by using**-set**property:
+You could also bind something back to the view model by using **-set** property:
```
@@ -68,13 +66,13 @@ You could also bind something back to the view model by using**-set**property:
```
-**-set**here tells XML that, properties referenced in the tag**\**are in the object returning from the**Something**property of the window, which is the view model in**\**. Now when**aControl.AProperty**is changed, the value will be updated to**Something.X**immediately.
+**-set** here tells XML that, properties referenced in the tag **\** are in the object returning from the **Something** property of the window, which is the view model in **\**. Now when **aControl.AProperty** is changed, the value will be updated to **Something.X** immediately.
## Bidirectional Binding
Bidirectional binding is a special type of binding, when two properties update each other.
-[ ](../.././gacui/components/ctemplates/commondatepickerlook.md)is a good example:
+[ ](../.././gacui/components/ctemplates/commondatepickerlook.md) is a good example:
```
@@ -82,11 +80,11 @@ Bidirectional binding is a special type of binding, when two properties update e
```
-In this example, when**self.Date**is changed, the value will be updates to**look.Date**, when**look.Date**is changed, the value will be updates to**self.Date**. Such biditional binding keep these two properties in sync, by using**-bind**twice on each other.
+ In this example, when **self.Date** is changed, the value will be updates to **look.Date**, when **look.Date** is changed, the value will be updates to **self.Date**. Such biditional binding keep these two properties in sync, by using **-bind** twice on each other.
-This doesn't cause the update loop to run infinitely because these two**Date**properties don't trigger their property changing event if the updated value is the same to the value before updating.
+This doesn't cause the update loop to run infinitely because these two **Date** properties don't trigger their property changing event if the updated value is the same to the value before updating.
-Properties create by the**prop Name : TYPE {}**syntax will not trigger the**NameChanged**event if the same value is updated to the property again. But for properties with explicit getter and setter, you must handle the setter properly:
+Properties create by the **prop Name : TYPE {}** syntax will not trigger the **NameChanged** event if the same value is updated to the property again. But for properties with explicit getter and setter, you must handle the setter properly:
```
class YourObject
{
@@ -111,5 +109,5 @@ class YourObject
prop Name: string {GetName, SetName : NameChanged}
}
```
-Otherwise using bidirectional binding on this property will trigger an infinite loop.
+ Otherwise using bidirectional binding on this property will trigger an infinite loop.
diff --git a/.github/KnowledgeBase/manual/gacui/advanced/cxrr.md b/.github/KnowledgeBase/manual/gacui/advanced/cxrr.md
index dd2b9159..536175e9 100644
--- a/.github/KnowledgeBase/manual/gacui/advanced/cxrr.md
+++ b/.github/KnowledgeBase/manual/gacui/advanced/cxrr.md
@@ -1,13 +1,13 @@
# Cross XML Resource References
-A GacUI XML Resource could[use some resources in another XML](../.././gacui/xmlres/cxrr.md). There are 3 types of resources:
-- Resource files: They could be accessed using**import-res://RESOURCE-NAME/...**in the**-uri binding**.
+A GacUI XML Resource could [use some resources in another XML](../.././gacui/xmlres/cxrr.md). There are 3 types of resources:
+- Resource files: They could be accessed using **import-res://RESOURCE-NAME/...** in the **-uri binding**.
- Objects that compiled to Workflow: They could be accessed using their generated class or interface names.
- Everything else: They could not be accessed from another XML.
## XML Resource Header
-To make a GacUI XML Resource be able to depend on or be depended by another resource, a header is required in**GacGenConfig/Metadata**like this:
+To make a GacUI XML Resource be able to depend on or be depended by another resource, a header is required in **GacGenConfig/Metadata** like this:
```
@@ -25,43 +25,43 @@ To make a GacUI XML Resource be able to depend on or be depended by another reso
```
- **/ResourceMetadata/@Name**: The name of the resource. All resources that loaded into an application should either have a unique name or have no name. If a resource want to depend on or to be depended by another resource, it should have a name.
-- **/ResourceMetadata/@Version**: The only legal value is**1.0**. It is bounded to the GacUI XML Resource Compiler (GacGen.exe). To ensure that all depended resources are compiled using a compatible version of compiler, an resource could only depend on another resource that has exactly the same version.
-- **/ResourceMetadata/Dependencies/Resource/@Name**: Here are all resources that the current resource depends on. The name must match their**/ResourceMetadata/@Name**in their metadata.
+- **/ResourceMetadata/@Version**: The only legal value is **1.0**. It is bounded to the GacUI XML Resource Compiler (GacGen.exe). To ensure that all depended resources are compiled using a compatible version of compiler, an resource could only depend on another resource that has exactly the same version.
+- **/ResourceMetadata/Dependencies/Resource/@Name**: Here are all resources that the current resource depends on. The name must match their **/ResourceMetadata/@Name** in their metadata.
## Compile Resource with Dependencies
-[GacBuild.ps1](https://github.com/vczh-libraries/Release/tree/master/Tools)is the only tool to properly compile resources with dependencies.
+[GacBuild.ps1](https://github.com/vczh-libraries/Release/tree/master/Tools) is the only tool to properly compile resources with dependencies.
-You need to have a file called**GacUI.xml**:
+You need to have a file called **GacUI.xml**:
```
```
-A GacUI XML Resource and all its dependeices must be put inside the folder containing**GacUI.xml**. Resource files could be put in any level of sub folders.
+ A GacUI XML Resource and all its dependeices must be put inside the folder containing **GacUI.xml**. Resource files could be put in any level of sub folders.
-Then you could call**GacBuild.ps1 -FileName path/to/GacUI.xml**in**PowerShell**. All resource files in the folder containing**GacUI.xml**will be found and compiled in the dependency order.
+Then you could call **GacBuild.ps1 -FileName path/to/GacUI.xml** in **PowerShell**. All resource files in the folder containing **GacUI.xml** will be found and compiled in the dependency order.
-**GacBuild.ps1**forces incremental build. If a resource is not changed, and all its dependencies are not changed, then the resource will not be compiled again. You could use**GacClear.ps1 -FileName path/to/GacUI.xml**to clear all cache, the next time**GacBuild.ps1**will recompile every resource files.
+**GacBuild.ps1** forces incremental build. If a resource is not changed, and all its dependencies are not changed, then the resource will not be compiled again. You could use **GacClear.ps1 -FileName path/to/GacUI.xml** to clear all cache, the next time **GacBuild.ps1** will recompile every resource files.
-Generated resource binaries, workflow binaries and C++ code will be put in places[specified in each GacUI XML Resource](../.././gacui/xmlres/cgc.md).
+Generated resource binaries, workflow binaries and C++ code will be put in places [specified in each GacUI XML Resource](../.././gacui/xmlres/cgc.md).
## Loading Resource Dependencies in your C++ Application
-**vl::presentation::GetResourceManager()-\>LoadResourceOrPending(fileStream[, errors][, usage]);**is the only function to load compiled resource binaries:
-- **fileStream**: It could be any[vl::stream::IStream](../.././vlppos/using-streams.md), you could use**FileStream**here to load a resource from file.
-- **errors**: If the resource could not be loaded, errors will be stored in this list. An empty error list after calling this function means the resource is loaded properly. If the**errors**argument is not use, then the function will crash if there is any error.
-- **usage**: It could be**InstanceClass**if you include all Workflow binaries into this resource file, and**DataOnly**if not. A resource binary containing Workflow binaries could be produced using[res://GacGenCppConfig/ResX86/Resource and res://GacGenCppConfig/ResX/Resource](../.././gacui/xmlres/cgc.md)**The content of Workflow binaries is different for x86 or x64**, you need to load the correct one.Typically, if you use compiled resource with generated C++ files instead of Workflow binaries, you only need the first argument.
+**vl::presentation::GetResourceManager()-\>LoadResourceOrPending(fileStream[, errors][, usage]);** is the only function to load compiled resource binaries:
+- **fileStream**: It could be any [vl::stream::IStream](../.././vlppos/using-streams.md), you could use **FileStream** here to load a resource from file.
+- **errors**: If the resource could not be loaded, errors will be stored in this list. An empty error list after calling this function means the resource is loaded properly. If the **errors** argument is not use, then the function will crash if there is any error.
+- **usage**: It could be **InstanceClass** if you include all Workflow binaries into this resource file, and **DataOnly** if not. A resource binary containing Workflow binaries could be produced using [res://GacGenCppConfig/ResX86/Resource and res://GacGenCppConfig/ResX/Resource](../.././gacui/xmlres/cgc.md)**The content of Workflow binaries is different for x86 or x64**, you need to load the correct one. Typically, if you use compiled resource with generated C++ files instead of Workflow binaries, you only need the first argument.
-You don't need to worry about the order to load resource files, they will be taken care of in this function, just call**LoadResourceOrPending**for all of them.
+You don't need to worry about the order to load resource files, they will be taken care of in this function, just call **LoadResourceOrPending** for all of them.
-Calling**LoadResourceOrPending**without all depended resources prepared results in delay loading. Such resource will be automatically loaded after all depended resources are loaded. You could call**GetResource**to see if a resource has already been loaded or not. If it returns**null**but**LoadResourceOrPending**succeeded, it means some depended resources are not prepared yet, and the loading is delayed.
+Calling **LoadResourceOrPending** without all depended resources prepared results in delay loading. Such resource will be automatically loaded after all depended resources are loaded. You could call **GetResource** to see if a resource has already been loaded or not. If it returns **null** but **LoadResourceOrPending** succeeded, it means some depended resources are not prepared yet, and the loading is delayed.
## Get Rid of Resource Files
-By using[CppResource or CppCompressed](../.././gacui/xmlres/cgc.md)in**res://GacGenConfig/Cpp**, you will get multiple cpp files for each GacUI XML Resource. Link all these cpp files to your project, resource binaries will be compiled into your executable file. When your application starts, all resources will be properly loaded before**GuiMain**.
+By using [CppResource or CppCompressed](../.././gacui/xmlres/cgc.md) in **res://GacGenConfig/Cpp**, you will get multiple cpp files for each GacUI XML Resource. Link all these cpp files to your project, resource binaries will be compiled into your executable file. When your application starts, all resources will be properly loaded before **GuiMain**.
## Using Resource in Dependedcies
-If there is a resource object**res://path/to/the/resource**in a GacUI XML Resource called**BaseResource**, another GacUI XML Resource depending on it could use**import-res://BaseResource/path/to/the/resource**. Such resource path could be use in**-uri binding**, or in the**ResolveResource**method in all[root UI instance](../.././gacui/xmlres/instance/root_instance.md).
+If there is a resource object **res://path/to/the/resource** in a GacUI XML Resource called **BaseResource**, another GacUI XML Resource depending on it could use **import-res://BaseResource/path/to/the/resource**. Such resource path could be use in **-uri binding**, or in the **ResolveResource** method in all [root UI instance](../.././gacui/xmlres/instance/root_instance.md).
-If a resource is compiled to Workflow classes or instances, just use the class or interface names directly. But if the resource is not in the dependency list (**/ResourceMetadata/Dependencies/Resource/@Name**), the class or interface name will not be found when running**GacBuild.ps1**, errors will be generated and the resource cannot be compiled.
+If a resource is compiled to Workflow classes or instances, just use the class or interface names directly. But if the resource is not in the dependency list (**/ResourceMetadata/Dependencies/Resource/@Name**), the class or interface name will not be found when running **GacBuild.ps1**, errors will be generated and the resource cannot be compiled.
diff --git a/.github/KnowledgeBase/manual/gacui/advanced/home.md b/.github/KnowledgeBase/manual/gacui/advanced/home.md
index ff67ea16..59036ccd 100644
--- a/.github/KnowledgeBase/manual/gacui/advanced/home.md
+++ b/.github/KnowledgeBase/manual/gacui/advanced/home.md
@@ -2,11 +2,10 @@
Here are advanced topics about using GacUI. Creating a tool using GacUI doesn't always involve these topic, but they are needed for applications with professional user interfaces.
-
- `empty list item`
**Interop with C++ View Model**
- Only UI objects are available to**Workflow**script. If you want your application to do**real thing**, which usually requires interop with resources and the operating system, You would like to use a native language to complete these jobs.
- In this section, it introduces a way to let**Workflow**in GacUI XML Resource be able to talk to your own C++ classes and functions.
+ Only UI objects are available to **Workflow** script. If you want your application to do **real thing**, which usually requires interop with resources and the operating system, You would like to use a native language to complete these jobs.
+ In this section, it introduces a way to let **Workflow** in GacUI XML Resource be able to talk to your own C++ classes and functions.
- `empty list item`
**Data Bindings**
Data binding is an important part of the Model-View-ViewModel pattern. It models the application logic (ViewModel) in a way that is familiar to software engineers. You can use whatever data structure you like, not only a class or an interface could be connected to the UI, but also list and tree data structures using data bindings.
@@ -23,14 +22,20 @@ Here are advanced topics about using GacUI. Creating a tool using GacUI doesn't
A GacUI XML Resource could use not only data resources, but also generated classes and interfaces from anothre resource file. The dependency also help GacUI to introduce incremental build, which significantly improve the build performance.
- `empty list item`
**ALT Sequence and Control Focus**
- Switching focus between controls is an important part of UI accessibility. By pressing**ALT**on a GacUI application, the UI allow you to locate a control using a customizable key sequence.
+ Switching focus between controls is an important part of UI accessibility. By pressing **ALT** on a GacUI application, the UI allow you to locate a control using a customizable key sequence.
- `empty list item`
**TAB and Control Focus**
- Switching focus between controls is an important part of UI accessibility. By pressing**TAB**on a GacUI application, it jumps from one control to another, if the focused control doesn't take**TAB**as key input.
+ Switching focus between controls is an important part of UI accessibility. By pressing **TAB** on a GacUI application, it jumps from one control to another, if the focused control doesn't take **TAB** as key input.
- `empty list item`
**Creating New List Controls**
GacUI already offers a set of list controls with powerful data bindings. But if it still don't meet your requirement, you could deeply customize a list control using C++.
- In this section you will learn how to customize: - Keyboard and mouse controlling - Virtual list item algorithm - Layouting list items - Data accessing - Creating your own way to performa data binding - and more ...
+ In this section you will learn how to customize:
+ - Keyboard and mouse controlling
+ - Virtual list item algorithm
+ - Layouting list items
+ - Data accessing
+ - Creating your own way to performa data binding
+ - and more ...
- `empty list item`
**Porting GacUI to Other Platforms**
GacUI decouples with any OS, sub systems and even renderer, from the first day it is created. If you like GacUI but it doesn't run on your platform, you could port GacUI to it, not by changing GacUI, but only creating a new adaptor to talk to the OS!
diff --git a/.github/KnowledgeBase/manual/gacui/advanced/impllistcontrol.md b/.github/KnowledgeBase/manual/gacui/advanced/impllistcontrol.md
index 83757cd0..6f3e7b07 100644
--- a/.github/KnowledgeBase/manual/gacui/advanced/impllistcontrol.md
+++ b/.github/KnowledgeBase/manual/gacui/advanced/impllistcontrol.md
@@ -1,63 +1,63 @@
# Creating New List Controls
-Customizing**GuiTextList**or**GuiBindableTextList**by providing new item templates , should be the most common way to create a new list control experience. But you could still create your new list control.
+Customizing **GuiTextList** or **GuiBindableTextList** by providing new item templates , should be the most common way to create a new list control experience. But you could still create your new list control.
-In GacUI 1.0, any new classes created completely by C++ (instead of by**\**in GacUI XML Resource) is not accessible in the GacUI XML Resource, because the compiler doesn't know about that.
+In GacUI 1.0, any new classes created completely by C++ (instead of by **\** in GacUI XML Resource) is not accessible in the GacUI XML Resource, because the compiler doesn't know about that.
-Any new list control is expected to derives from**GuiSelectableListControl**directly. If list items are not selectable, then**GuiListControl**could be used to reduce runtime overhead.
+Any new list control is expected to derives from **GuiSelectableListControl** directly. If list items are not selectable, then **GuiListControl** could be used to reduce runtime overhead.
## list::IItemProvider, the constructor argument
-An instance of**IItemProvider**is required in the constructor of**GuiListControl**and**GuiSelectableListControl**. The base class doesn't control the life cycle of this instance, it should be properly disposed in the derived class.
+An instance of **IItemProvider** is required in the constructor of **GuiListControl** and **GuiSelectableListControl**. The base class doesn't control the life cycle of this instance, it should be properly disposed in the derived class.
-This interface offers a bridge so that**GuiListControl**could access its items.
-- **AttachCallback**: Multiple**IItemProviderCallback**could be installed to an**IItemProvider**. When a callback is properly installed, its**OnAttached(this)**must be called immediately.
-- **DetachCallback**: This method is called to remove an installed**IItemProviderCallback**. When a callback is properly uninstalled, its**OnAttached(nullptr)**must be called immediately.
+This interface offers a bridge so that **GuiListControl** could access its items.
+- **AttachCallback**: Multiple **IItemProviderCallback** could be installed to an **IItemProvider**. When a callback is properly installed, its **OnAttached(this)** must be called immediately.
+- **DetachCallback**: This method is called to remove an installed **IItemProviderCallback**. When a callback is properly uninstalled, its **OnAttached(nullptr)** must be called immediately.
- **PushEditing**: This method is called when the list control enters another level of editing mode.
- **PopEditing**: This method is called when the list control leaves one level of editing mode.
-- **IsEditing**: This method should return**true**if at least one level of editing mode is still in the list control.
-- **Count**: This method should return the total number of items in the list control. In**GuiTreeView**, all collapsed items are not counted. Although they exist in the logical tree, but if a node is collapsed, all sub items will be treated as removed by calling**IItemProviderCallback::OnItemModified**. And when a node is expanded, all sub items come back in the same way.
-- **GetTextValue**: This method should return a text representation for a given item. The value will be copied to the**Text**property of a item template.
-- **GetBindingValue**: This method should return a**non-null**object for a given item, if data binding for item source is available in this control. For non-bindable list controls, a**null**object should be returned by calling the constructor of the return value with no argument, for example,**{}**in C++.
-- **RequestView**: This method provides a way to decouple between the list control and the details of items.**IItemProvider**should handle the life cycle of all returned views.
+- **IsEditing**: This method should return **true** if at least one level of editing mode is still in the list control.
+- **Count**: This method should return the total number of items in the list control. In **GuiTreeView**, all collapsed items are not counted. Although they exist in the logical tree, but if a node is collapsed, all sub items will be treated as removed by calling **IItemProviderCallback::OnItemModified**. And when a node is expanded, all sub items come back in the same way.
+- **GetTextValue**: This method should return a text representation for a given item. The value will be copied to the **Text** property of a item template.
+- **GetBindingValue**: This method should return a **non-null** object for a given item, if data binding for item source is available in this control. For non-bindable list controls, a **null** object should be returned by calling the constructor of the return value with no argument, for example, **{}** in C++.
+- **RequestView**: This method provides a way to decouple between the list control and the details of items. **IItemProvider** should handle the life cycle of all returned views.
-**list::ItemProviderBase**could be used to create an**IItemProvider**. The following methods are implemented in this class:
+**list::ItemProviderBase** could be used to create an **IItemProvider**. The following methods are implemented in this class:
- **AttachCallback**
- **DetachCallback**
- **PushEditing**
- **PopEditing**
-- **IsEditing**You need to implement the rest to complete an**IItemProvider**. The**InvokeOnItemModified**method is provider to call**OnItemModified**in all installed callbacks.
+- **IsEditing** You need to implement the rest to complete an **IItemProvider**. The **InvokeOnItemModified** method is provider to call **OnItemModified** in all installed callbacks.
## list::IItemProviderCallback, the constructor argument
-The**OnItemModified**allow**IItemProvider**to report one change of consecutive items:
+The **OnItemModified** allow **IItemProvider** to report one change of consecutive items:
- **start**: The index of the first item in all changing consecutive items.
- **count**: The numbers of all changing consecutive items.
- **newCount**: The numbers of new items that all changing consecutive items change into.
-If changes happens in multiple groups of consecutive items, each group should be reported in separate call to**OnItemModified**. You must try your best to ensure that,**IItemProvider::Count**,**IItemProvider::GetTextValue**,**IItemProvider::GetBindingValue**and all related methods in views from**RequestView**should not see any unreported changes.
+If changes happens in multiple groups of consecutive items, each group should be reported in separate call to **OnItemModified**. You must try your best to ensure that, **IItemProvider::Count**, **IItemProvider::GetTextValue**, **IItemProvider::GetBindingValue** and all related methods in views from **RequestView** should not see any unreported changes.
-Call**OnItemModified(start, 0, count)**when a group of items are inserted to the position**start**. If one item is inserted,**count**should be**1**.
+Call **OnItemModified(start, 0, count)** when a group of items are inserted to the position **start**. If one item is inserted, **count** should be **1**.
-Call**OnItemModified(start, count, 0)**when a group of items are removed from the position**start**. If one item is removed,**count**should be**1**.
+Call **OnItemModified(start, count, 0)** when a group of items are removed from the position **start**. If one item is removed, **count** should be **1**.
-Call**OnItemModified(start, count, count)**when a group of items are updated beginning from the position**start**. If one item is updated,**count**should be**1**. An item is updated, if the item is replaced, or any interested content inside this item is updated.
+Call **OnItemModified(start, count, count)** when a group of items are updated beginning from the position **start**. If one item is updated, **count** should be **1**. An item is updated, if the item is replaced, or any interested content inside this item is updated.
## GuiListControl::IItemArranger, the item layouting
-**IItemArranger**handles rendering of list items. An**IItemArranger**is attached to a list control using its**Arranger**property or its protected method**SetStyleAndArranger**.
+**IItemArranger** handles rendering of list items. An **IItemArranger** is attached to a list control using its **Arranger** property or its protected method **SetStyleAndArranger**.
-There are already some[built-in IItemArranger implementations](../.././gacui/components/controls/list/guilistcontrol.md). Check them out to see if any of the built-in things work, so you don't have to implement this interface.
+There are already some [built-in IItemArranger implementations](../.././gacui/components/controls/list/guilistcontrol.md). Check them out to see if any of the built-in things work, so you don't have to implement this interface.
-It is recommended to inherited from**[GuiVirtualRepeatCompositionBase](../.././gacui/components/compositions/repeat_virtual.md)**when you have to create a new layout. When such new composition is ready, use**VirtualRepeatRangedItemArrangerBase\**to turn it into an**IItemArranger**.
+It is recommended to inherited from **[GuiVirtualRepeatCompositionBase](../.././gacui/components/compositions/repeat_virtual.md)** when you have to create a new layout. When such new composition is ready, use **VirtualRepeatRangedItemArrangerBase\** to turn it into an **IItemArranger**.
-**IItemProviderCallback**is also the base class of**IItemArranger**. When an**IItemArranger**is attached to a list control, it will be installed as a callback to**IItemProvider**. So that**IItemArranger**could update the rendering when any item is changed.
+**IItemProviderCallback** is also the base class of **IItemArranger**. When an **IItemArranger** is attached to a list control, it will be installed as a callback to **IItemProvider**. So that **IItemArranger** could update the rendering when any item is changed.
-A**IItemArranger**should be aware of the[DisplayItemBackground](../.././gacui/components/controls/list/guilistcontrol.md)property of a list control. If this property returns**true**, all item template instances returned from**IItemArrangerCallback::ReleaseItem**should be contained in a**GuiSelectableButton**as the item background using
-- The**ThemeNameLLListItemBackground**as the theme of this button.
-- **listControl-\>TypedControlTemplateObject(true)-\>GetBackgroundTemplate()**as the control template of this button.
+A **IItemArranger** should be aware of the [DisplayItemBackground](../.././gacui/components/controls/list/guilistcontrol.md) property of a list control. If this property returns **true**, all item template instances returned from **IItemArrangerCallback::ReleaseItem** should be contained in a **GuiSelectableButton** as the item background using
+- The **ThemeNameLLListItemBackground** as the theme of this button.
+- **listControl-\>TypedControlTemplateObject(true)-\>GetBackgroundTemplate()** as the control template of this button.
-All locations, sizes and margins involved in this interface are all**virtual**.**IItemArranger**just need to provide item layout in the**LeftDown**direction. The[Axis](../.././gacui/components/controls/list/guilistcontrol.md)property will be used by the list control to adjust locations and sizes of all visible items to layout them in the expected direction.
+All locations, sizes and margins involved in this interface are all **virtual**. **IItemArranger** just need to provide item layout in the **LeftDown** direction. The [Axis](../.././gacui/components/controls/list/guilistcontrol.md) property will be used by the list control to adjust locations and sizes of all visible items to layout them in the expected direction.
Here are all methods to implemement:
- `empty list item`
@@ -65,67 +65,66 @@ Here are all methods to implemement:
- `empty list item`
**DetachListControl**: This method is called when it is detached from a list control.
- `empty list item`
- **GetCallback**: Get the argument from the last**SetCallback**call.
+ **GetCallback**: Get the argument from the last **SetCallback** call.
- `empty list item`
- **SetCallback**: This method is called when it is attached to a list control. Only one callback will be installed to**IItemArranger**. This callback provides everything that an**IItemArranger**could do the a list control.
+ **SetCallback**: This method is called when it is attached to a list control. Only one callback will be installed to **IItemArranger**. This callback provides everything that an **IItemArranger** could do the a list control.
- `empty list item`
**GetTotalSize**: Return the total size of all items in their layout.
- `empty list item`
- **GetVisibleStyle**: This method should return the item template instance for a give item. If the item is invisible because it is scrolled out of the visible area of the list control, it should return**nullptr**.
- Living item template instances for items could be managed using**IItemArrangerCallback::RequestItem**and**IItemArrangerCallback::ReleaseItem**.
+ **GetVisibleStyle**: This method should return the item template instance for a give item. If the item is invisible because it is scrolled out of the visible area of the list control, it should return **nullptr**.
+ Living item template instances for items could be managed using **IItemArrangerCallback::RequestItem** and **IItemArrangerCallback::ReleaseItem**.
- `empty list item`
- **GetVisibleIndex**: This method should return the item index for a given item template instance. If such an instance is unknown to this**IItemArranger**, it should return**-1**.
+ **GetVisibleIndex**: This method should return the item index for a given item template instance. If such an instance is unknown to this **IItemArranger**, it should return **-1**.
- `empty list item`
**ReloadVisibleStyles**: Recreate all UI objects for visible items. Items don't need to be recreated immediately, but all UI objects for items should be disposed in the call to this method.
- **GetVisibleStyle**and**GetVisibleIndex**could pretend that all items are invisible until the next call to**OnViewChanged**.
+ **GetVisibleStyle** and **GetVisibleIndex** could pretend that all items are invisible until the next call to **OnViewChanged**.
- `empty list item`
- **OnViewChanged**: This method is called to tell the**IItemArranger**what is the visible part in**GetTotalSize**.
- **IItemArranger**could only create UI objects for items in this area, to reduce the memory pressure and improve the performance.**IItemArranger**could also create UI objects for all items if performance is not important. All items with their UI objects created are**visible items**.
- Living item template instances for items could be managed using**IItemArrangerCallback::RequestItem**and**IItemArrangerCallback::ReleaseItem**.
+ **OnViewChanged**: This method is called to tell the **IItemArranger** what is the visible part in **GetTotalSize**.
+ **IItemArranger** could only create UI objects for items in this area, to reduce the memory pressure and improve the performance. **IItemArranger** could also create UI objects for all items if performance is not important. All items with their UI objects created are **visible items**.
+ Living item template instances for items could be managed using **IItemArrangerCallback::RequestItem** and **IItemArrangerCallback::ReleaseItem**.
- `empty list item`
- **FindItem**: Search a next item from the specified item**itemIndex**using a keyboard operation**key**.**-1**could be returned if no reasonable item is definded as**the next item**.
-- **EnsureItemVisible**: This method is called if the list control want to scroll to an area to make a given item visible.**IItemArrangerCallback::SetViewLocation**is usually called as a respond.**OnViewChanged**could be called in**SetViewLocation**.
+ **FindItem**: Search a next item from the specified item **itemIndex** using a keyboard operation **key**. **-1** could be returned if no reasonable item is definded as **the next item**.
+- **EnsureItemVisible**: This method is called if the list control want to scroll to an area to make a given item visible. **IItemArrangerCallback::SetViewLocation** is usually called as a respond. **OnViewChanged** could be called in **SetViewLocation**.
- **GetAdoptedSize**: Return a reasonable size for the visible area of items, if the list control is used as a combo box dropdown list.
## GuiListControl::IItemArrangerCallback, the item layouting
-All locations, sizes and margins involved in this interface are all**virtual**.**IItemArranger**just need to provide item layout in the**LeftDown**direction. The[Axis](../.././gacui/components/controls/list/guilistcontrol.md)property will be used by the list control to adjust locations and sizes of all visible items to layout them in the expected direction.
+All locations, sizes and margins involved in this interface are all **virtual**. **IItemArranger** just need to provide item layout in the **LeftDown** direction. The [Axis](../.././gacui/components/controls/list/guilistcontrol.md) property will be used by the list control to adjust locations and sizes of all visible items to layout them in the expected direction.
-
-- **RequestItem**: Ask the list control to create an item template instance for a specific item. An item template instance that is released by calling**ReleaseItem**could be reused for a different item.
+- **RequestItem**: Ask the list control to create an item template instance for a specific item. An item template instance that is released by calling **ReleaseItem** could be reused for a different item.
- **ReleaseItem**: Ask the list control to dispose an item template instance for a specific item. The item template instance will be deleted from the memory later if necessary, the pointer should not be used anymore after calling this method.
- **SetViewLocation**: Tell the list control what should be the left-top corner of the visible area. But the list control could move the visible area to a different location closed by if it thinks this is better.
-- **GetStylePreferredSize**: Read the size of the**CachedMinSize**property of a compositon contained by list control.**IMPORTANT**: the result is**virtual**. Do not use this property directly, use this method instead.
-- **SetStyleAlignmentToParent**: Update the**AlignmentToParent**property of a composition contained by list control.**IMPORTANT**: the result is**virtual**. Do not use this property directly, use this method instead.
-- **GetStyleBounds**: Read the**Bounds**property of a composition contained by list control.**IMPORTANT**: the result is**virtual**. Do not use this property directly, use this method instead.
-- **SetStyleBounds**: Update the**Bounds**property of a composition contained by list control.**IMPORTANT**: the result is**virtual**. Do not use this property directly, use this method instead.
+- **GetStylePreferredSize**: Read the size of the **CachedMinSize** property of a compositon contained by list control. **IMPORTANT**: the result is **virtual**. Do not use this property directly, use this method instead.
+- **SetStyleAlignmentToParent**: Update the **AlignmentToParent** property of a composition contained by list control. **IMPORTANT**: the result is **virtual**. Do not use this property directly, use this method instead.
+- **GetStyleBounds**: Read the **Bounds** property of a composition contained by list control. **IMPORTANT**: the result is **virtual**. Do not use this property directly, use this method instead.
+- **SetStyleBounds**: Update the **Bounds** property of a composition contained by list control. **IMPORTANT**: the result is **virtual**. Do not use this property directly, use this method instead.
- **GetContainerComposition**: Get the composition as a container to store all UI objects for items.
-- **OnTotalSizeChanged**: Call this method to tell the list control that**IItemArranger::GetTotalSize**has been changed.
+- **OnTotalSizeChanged**: Call this method to tell the list control that **IItemArranger::GetTotalSize** has been changed.
## Using IItemProvider::RequestView Properly
-A list control could override**OnStyleInstalled**from**GuiListControl**. This method is called when an item template instance is binded to a list item.
+A list control could override **OnStyleInstalled** from **GuiListControl**. This method is called when an item template instance is binded to a list item.
A new list control class typlically defines a new item template class for an item. the new item template class adds new properties to define how an item for this new list control should look like.
-One or more views could be defined to read or write details for an item for this particular list control class. Then the list control class could call**RequestView**for a view using a unique identifier string, to bind data from the view to item template instances.
+One or more views could be defined to read or write details for an item for this particular list control class. Then the list control class could call **RequestView** for a view using a unique identifier string, to bind data from the view to item template instances.
-For example:**GuiTextList**defines the**ITextItemView**view to add the**Checked**property to items.
+For example: **GuiTextList** defines the **ITextItemView** view to add the **Checked** property to items.
-**IItemArranger**could also defines its own views. For example,**ListViewColumnItemArranger**defines**IColumnItemView**to read columns from the list control to render column headers. Any list control using**ListViewColumnItemArranger**should make sure that**IColumnItemView**is implemented and accessible from**IItemProvider::RequestView**.
+**IItemArranger** could also defines its own views. For example, **ListViewColumnItemArranger** defines **IColumnItemView** to read columns from the list control to render column headers. Any list control using **ListViewColumnItemArranger** should make sure that **IColumnItemView** is implemented and accessible from **IItemProvider::RequestView**.
You can define your own view for any purpose, as long as it is only used to read or write details of for items.
## Data Binding on Items
-A data bindable list control could read or write items from a item source implementing**Ptr\**. This object could also implement any derived interfaces like:
+A data bindable list control could read or write items from a item source implementing **Ptr\**. This object could also implement any derived interfaces like:
- **IValueReadonlyList**
- **IValueList**
-- **IValueObservableList**If the item source implements**IValueObservableList**, then the list control is expected to update automatically when items are changed.
+- **IValueObservableList** If the item source implements **IValueObservableList**, then the list control is expected to update automatically when items are changed.
-[The readable property type](../.././gacui/xmlres/instance/properties.md)and[the writable property type](../.././gacui/xmlres/instance/properties.md)could be used to let the user tell you how to access details from items.**vl::presentation::controls::ReadProperty**and**vl::presentation::controls::WriteProperty**could be used on these property types in C++.
+[The readable property type](../.././gacui/xmlres/instance/properties.md) and [the writable property type](../.././gacui/xmlres/instance/properties.md) could be used to let the user tell you how to access details from items. **vl::presentation::controls::ReadProperty** and **vl::presentation::controls::WriteProperty** could be used on these property types in C++.
## Sample
-You are strongly recommended to read the source code of**GuiTextList**and**GuiBindableTextList**before creating your own list control classes.
+You are strongly recommended to read the source code of **GuiTextList** and **GuiBindableTextList** before creating your own list control classes.
diff --git a/.github/KnowledgeBase/manual/gacui/advanced/localization.md b/.github/KnowledgeBase/manual/gacui/advanced/localization.md
index e1f868e3..b43b1963 100644
--- a/.github/KnowledgeBase/manual/gacui/advanced/localization.md
+++ b/.github/KnowledgeBase/manual/gacui/advanced/localization.md
@@ -1,31 +1,30 @@
# Localization
-The GacUI XML[ ](../.././gacui/xmlres/tag_localizedstrings.md)resource creates multi-language string template as bindable objects.
+The GacUI XML [ ](../.././gacui/xmlres/tag_localizedstrings.md) resource creates multi-language string template as bindable objects.
-The GacUI XML[ ](../.././gacui/xmlres/tag_localizedstringsinjection.md)resource adds more languages to an existing**\**.
+The GacUI XML [ ](../.././gacui/xmlres/tag_localizedstringsinjection.md) resource adds more languages to an existing **\**.
## \
-**\**imports a**\**to the current UI instance:
+**\** imports a **\** to the current UI instance:
```
```
-- **Name**: The name of this string resource. It will also create a property in the current UI instance in the same name. The property value could be changed at runtime. Unlike**\**, the instance knows how to initialize a string resource, so it doesn't create a constructor parameter.
-- **Class**: The full name of the string resource class. The resource should look like this to be referenced using**Class="demo::StringResource"**:
+- **Name**: The name of this string resource. It will also create a property in the current UI instance in the same name. The property value could be changed at runtime. Unlike **\**, the instance knows how to initialize a string resource, so it doesn't create a constructor parameter.
+- **Class**: The full name of the string resource class. The resource should look like this to be referenced using **Class="demo::StringResource"**:
```
...
```
-
-- **Default**: Specify a default string resource. If there are multiple**\**, only one of them could be the default string resource.
+- **Default**: Specify a default string resource. If there are multiple **\**, only one of them could be the default string resource.
## -str Binding
-The value of the**-str**binding must be a[Workflow call expression](../.././workflow/lang/expr.md). The function could be either**METHOD**or**NAME.METHOD**.
-- **METHOD**: This syntax use the**default string resource**.**METHOD**must be one of the**Name**attribute of a**\**in the referenced**\**.
-- **NAME.METHOD**: Unlike the above one, this syntax use the**\**whose**Name**attribute is**NAME**.Once the string resource and the string item is located, the**-str**binding will check if arguments match the type requirement. Note that parameter types of the same string item in different languages should be exactly the same in one**\**, so it doesn't matter which is the current UI language. This also ensure that you are able to switch the UI language at runtime.
+The value of the **-str** binding must be a [Workflow call expression](../.././workflow/lang/expr.md). The function could be either **METHOD** or **NAME.METHOD**.
+- **METHOD**: This syntax use the **default string resource**. **METHOD** must be one of the **Name** attribute of a **\** in the referenced **\**.
+- **NAME.METHOD**: Unlike the above one, this syntax use the **\** whose **Name** attribute is **NAME**. Once the string resource and the string item is located, the **-str** binding will check if arguments match the type requirement. Note that parameter types of the same string item in different languages should be exactly the same in one **\**, so it doesn't matter which is the current UI language. This also ensure that you are able to switch the UI language at runtime.
## Using -bind or -format on String Resources
@@ -33,25 +32,25 @@ For a string resource imported by:
```
```
-The**-str**binding is also a data binding, so it knows when the**Strings**property is changed, and update the property value.
+ The **-str** binding is also a data binding, so it knows when the **Strings** property is changed, and update the property value.
-Assume the default string resource is**Strings**, the following binding code
+Assume the default string resource is **Strings**, the following binding code
- **-str="Something(p1, p2, p3)"**
-- **-str="Strings.Something(p1, p2, p3)"**is equivalent to
+- **-str="Strings.Something(p1, p2, p3)"** is equivalent to
- **-bind="self.Strings.Something(p1, p2, p3)"**
-- **-format="$(self.Strings.Something(p1, p2, p3))"**when the current UI instance has a**ref.Name="self"**attribute.
+- **-format="$(self.Strings.Something(p1, p2, p3))"** when the current UI instance has a **ref.Name="self"** attribute.
## Switching the UI Language
The only way to specify the UI language is:
- **C++**: GetApplication()-\>SetLocale(LOCALE);
-- **Workflow**: presentation::controls::GuiApplication.GetApplication().Locale = LOCALE;This configuration affect all windows in the current process.
+- **Workflow**: presentation::controls::GuiApplication.GetApplication().Locale = LOCALE; This configuration affect all windows in the current process.
For a string resource imported by:
```
```
-When the application locale is changed, the**Strings**property of the current UI object will be replaced by a new object, which is from a**\**in the referenced**\**for that locale. If the specified locale doesn't exist in that localized string, the default one will be used.
+ When the application locale is changed, the **Strings** property of the current UI object will be replaced by a new object, which is from a **\** in the referenced **\** for that locale. If the specified locale doesn't exist in that localized string, the default one will be used.
-Such**\**will also create an interface called demo::**I**StringResource**Strings**, which becomes the type of the**Strings**property if it is imported using the above**\**. Usually you don't need to use either the generated class**demo::StringResource**. or the generated interface**demo::IStringResourceStrings**.
+Such **\** will also create an interface called demo::**I**StringResource**Strings**, which becomes the type of the **Strings** property if it is imported using the above **\**. Usually you don't need to use either the generated class **demo::StringResource**. or the generated interface **demo::IStringResourceStrings**.
diff --git a/.github/KnowledgeBase/manual/gacui/advanced/tab.md b/.github/KnowledgeBase/manual/gacui/advanced/tab.md
index b183d66b..845ea410 100644
--- a/.github/KnowledgeBase/manual/gacui/advanced/tab.md
+++ b/.github/KnowledgeBase/manual/gacui/advanced/tab.md
@@ -1,22 +1,22 @@
# TAB and Control Focus
-If a focusable control is put on a window, by setting the[TabPriority](../.././gacui/components/controls/basic/home.md)property to a value that is not**-1**, then it could get focused by pressing**TAB**.
+If a focusable control is put on a window, by setting the [TabPriority](../.././gacui/components/controls/basic/home.md) property to a value that is not **-1**, then it could get focused by pressing **TAB**.
-Pressing**TAB**switches the focus between different controls in a window, in the order of their**TabPriority**from less to greater, when both**IsTabEnabled**and**IsTabAvailable**return**true**. If the value is less than**-1**, then they will be treated as**0xFFFFFFFFFFFFFFFF**. The order between controls with the same**TabPriority**is undefined.
+Pressing **TAB** switches the focus between different controls in a window, in the order of their **TabPriority** from less to greater, when both **IsTabEnabled** and **IsTabAvailable** return **true**. If the value is less than **-1**, then they will be treated as **0xFFFFFFFFFFFFFFFF**. The order between controls with the same **TabPriority** is undefined.
## Behavior after being Focused
-A focusable control will just get focused if**TAB**decides to give the focus to this control.
+A focusable control will just get focused if **TAB** decides to give the focus to this control.
## Create your own Behavior
-If a new control class is created, there are multiple ways to customize the behavior about how a control should react to**TAB**:
+If a new control class is created, there are multiple ways to customize the behavior about how a control should react to **TAB**:
### Using IGuiTabAction
-**IGuiTabAction**is a protected base class of all controls. If a new control is created, methods could be overriden.
+**IGuiTabAction** is a protected base class of all controls. If a new control is created, methods could be overriden.
-**IsTabEnabled**returns**true**if the control is visible and enabled.**IsTabAvailable**returns**true**if the control is focusable.
+**IsTabEnabled** returns **true** if the control is visible and enabled. **IsTabAvailable** returns **true** if the control is focusable.
-The default value from**GetAcceptTabInput**is**false**. But a few controls like text controls or document controls set this value to**true**. When**GetAcceptTabInput**is**true**, it means this control defines the behavior for this key, like entering a**TAB**character, so that it doesn't want the focus to be switched to another control. Calling**SetAcceptTabInput**could change this value.
+The default value from **GetAcceptTabInput** is **false**. But a few controls like text controls or document controls set this value to **true**. When **GetAcceptTabInput** is **true**, it means this control defines the behavior for this key, like entering a **TAB** character, so that it doesn't want the focus to be switched to another control. Calling **SetAcceptTabInput** could change this value.
diff --git a/.github/KnowledgeBase/manual/gacui/advanced/vm.md b/.github/KnowledgeBase/manual/gacui/advanced/vm.md
index fb3a8ea3..fc0152d9 100644
--- a/.github/KnowledgeBase/manual/gacui/advanced/vm.md
+++ b/.github/KnowledgeBase/manual/gacui/advanced/vm.md
@@ -1,52 +1,52 @@
# Interop with C++ View Model
-It is recommended to use the[MVVM](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel)pattern with GacUI:
+It is recommended to use the [MVVM](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel) pattern with GacUI:
- `empty list item`
- **Model**: It refers to a domain model. Code in**Model**solves real problem that users need. It could be an object-oriented design of a domain, it could also be a data access layer to the data in database, from the internet, or any possible way.
+ **Model**: It refers to a domain model. Code in **Model** solves real problem that users need. It could be an object-oriented design of a domain, it could also be a data access layer to the data in database, from the internet, or any possible way.
- `empty list item`
- **ViewModel**: It refers to a set of interface exposing the**Model**in a convient way for**Views**. Data organization in**Model**doesn't have to be UI friendly. It is the**ViewModel**who exposes a right set of operations, to make**Views**access**Model**convenient.
- For example, there are many applications offer list sorting to users. Data in**Model**is not sorted, it could be indexed, because there is so many way to sort the data, it is a waste of storage to cache all sorting result. When a user sort the data in a specific way, it is the**ViewModel**who handels the sorting. the**ViewModel**accesses the data, return the data organization in a sorted way.
+ **ViewModel**: It refers to a set of interface exposing the **Model** in a convient way for **Views**. Data organization in **Model** doesn't have to be UI friendly. It is the **ViewModel** who exposes a right set of operations, to make **Views** access **Model** convenient.
+ For example, there are many applications offer list sorting to users. Data in **Model** is not sorted, it could be indexed, because there is so many way to sort the data, it is a waste of storage to cache all sorting result. When a user sort the data in a specific way, it is the **ViewModel** who handels the sorting. the **ViewModel** accesses the data, return the data organization in a sorted way.
- `empty list item`
- **View**: A**View**could be the actual UI of an application, it could also be a set of unit tests.**Views**access**ViewModel**, typically it doesn't access**Model**.
+ **View**: A **View** could be the actual UI of an application, it could also be a set of unit tests. **Views** access **ViewModel**, typically it doesn't access **Model**.
-In GacUI,**ViewModels**are defined as a set of interfaces in[Workflow script files](../.././gacui/xmlres/tag_script.md).**Views**are defined as a set of[windows and controls](../.././gacui/xmlres/instance/root_instance.md).
+In GacUI, **ViewModels** are defined as a set of interfaces in [Workflow script files](../.././gacui/xmlres/tag_script.md). **Views** are defined as a set of [windows and controls](../.././gacui/xmlres/instance/root_instance.md).
-All**ViewModels**that are needed in a**View**are defined as[ ](../.././gacui/xmlres/tag_instance.md), which represents constructor arguments to that**View**. The**Class**attributes of such**\**will be interfaces for**ViewModels**.
+All **ViewModels** that are needed in a **View** are defined as [ ](../.././gacui/xmlres/tag_instance.md), which represents constructor arguments to that **View**. The **Class** attributes of such **\** will be interfaces for **ViewModels**.
-In the GacUI entry point (the**GuiMain**function), a main window will be created. If the main window needs**ViewModels**, the main window**\**will have one or more**\**, then the constructor of the main window will have one or more constructor arguments.
+In the GacUI entry point (the **GuiMain** function), a main window will be created. If the main window needs **ViewModels**, the main window **\** will have one or more **\**, then the constructor of the main window will have one or more constructor arguments.
-Now,**GuiMain**just needs to create classes that implement these interfaces, and gives all of them to the constructor of the main window, then**ViewModels**and the**View**is connected together.
+Now, **GuiMain** just needs to create classes that implement these interfaces, and gives all of them to the constructor of the main window, then **ViewModels** and the **View** is connected together.
## Sample
-[This](https://github.com/vczh-libraries/Release/tree/master/Tutorial/GacUI_HelloWorlds/MVVM)is a very simple example for using MVVM in GacUI.
+[This](https://github.com/vczh-libraries/Release/tree/master/Tutorial/GacUI_HelloWorlds/MVVM) is a very simple example for using MVVM in GacUI.

-The**ViewModel**is an interface:
+The **ViewModel** is an interface:
```
interface IViewModel
{
func GetUserName() : string;
func SetUserName(value : string) : void;
prop UserName : string {GetUserName, SetUserName}
-
+
func GetPassword() : string;
func SetPassword(value : string) : void;
prop Password : string {GetPassword, SetPassword}
-
+
func GetUserNameError() : string;
event UserNameErrorChanged();
prop UserNameError : string {GetUserNameError : UserNameErrorChanged}
-
+
func GetPasswordError() : string;
event PasswordErrorChanged();
prop PasswordError : string {GetPasswordError : PasswordErrorChanged}
-
+
func SignUp() : bool;
}
```
-It defines all**View**needs to know:
+ It defines all **View** needs to know:
- Accessing the user name and the password.
- Retriving validation results for the user name and the password.
@@ -58,13 +58,11 @@ When the content of a text box is changed, the data is stored to the view model.
...
```
-
When the validation result is changed, errors are displayed to the UI immediately. This is implemented using data bindings to UI objects:
```
```
-
When the user name or the password is stored to the view model, validation results are updated automatically. This is implemented in a C++ class which inherits the interface:
```
class ViewModel : public Object, public virtual vm::IViewModel
@@ -115,8 +113,7 @@ public:
};
```
-
-It is very easy to connect the**ViewModel**to the**View**:
+It is very easy to connect the **ViewModel** to the **View**:
```
void GuiMain()
{
@@ -127,6 +124,5 @@ void GuiMain()
}
```
-
-Collection objects or tree-like objects can be binded to[list controls](../.././gacui/components/controls/list/home.md)directly. Data bindings accept any[workflow expressions](../.././workflow/lang/bind.md)that compiles. MVVM in GacUI is very powerful, you are free to choose any way to define**ViewModel**interfaces, and it is always possible to bind it to the UI.
+Collection objects or tree-like objects can be binded to [list controls](../.././gacui/components/controls/list/home.md) directly. Data bindings accept any [workflow expressions](../.././workflow/lang/bind.md) that compiles. MVVM in GacUI is very powerful, you are free to choose any way to define **ViewModel** interfaces, and it is always possible to bind it to the UI.
diff --git a/.github/KnowledgeBase/manual/gacui/coding-agent/automation-service.md b/.github/KnowledgeBase/manual/gacui/coding-agent/automation-service.md
new file mode 100644
index 00000000..0646178c
--- /dev/null
+++ b/.github/KnowledgeBase/manual/gacui/coding-agent/automation-service.md
@@ -0,0 +1,118 @@
+# AutomationService
+
+AutomationService is the GacUI surface for programmatic inspection and input. It is exposed by `INativeAutomationService` through `GetCurrentController()->AutomationService()`. Coding agents use it to read the current UI structure and send input commands without depending on operating-system UI Automation.
+
+The service is independent from the remote protocol. A normal Windows application, a remote protocol core application, and a remote protocol renderer can all expose an automation service, but each setup exposes the view of the UI that exists on that side.
+
+## Service Interface
+
+`INativeAutomationService` has one service-level availability flag and three feature groups:
+- `Available`: returns false when no automation service exists for the current controller.
+- `Stop`: turns off all features. Windows implementations also stop the HTTP listener.
+- `CanDumpControlTree` and `DumpControlTree`: expose visible GacUI windows, popups, controls and compositions.
+- `CanDumpDomTree` and `DumpDomTree`: expose the remote protocol renderer DOM.
+- `CanRunIOCommands` and `RunIOCommand`: send a textual IO command to the main window or to a selected native window.
+
+Feature availability is checked separately. A real service returns true from `Available` even if a specific feature is unsupported. Unsupported features should return false from the corresponding `Can...` function and return an empty string from the operation.
+
+## Windows HTTP Layer
+
+`StartWindowsHttpAutomationService` creates a localhost HTTP wrapper around the current `INativeAutomationService`. It is declared in `PlatformProviders/Windows/WinNativeWindow.h` and implemented by the Windows platform provider. If `GetCurrentController()->AutomationService()->Available()` is false, the function returns without starting a listener.
+
+The function takes `applicationName` as a URL path fragment and `port` as the localhost port. Given `applicationName == L"Automation/MyApp"` and `port == 8888`, the listener prefix is `http://localhost:8888/Automation/MyApp/`. The service offers exactly these HTTP URLs:
+- `GET http://localhost:8888/Automation/MyApp/Controls`: calls `DumpControlTree` on the UI thread when `CanDumpControlTree` is true.
+- `GET http://localhost:8888/Automation/MyApp/Dom`: calls `DumpDomTree` on the UI thread when `CanDumpDomTree` is true.
+- `POST http://localhost:8888/Automation/MyApp/IO`: passes the UTF-8 request body to `RunIOCommand` with no window id.
+- `POST http://localhost:8888/Automation/MyApp/IO/`: passes the UTF-8 request body to `RunIOCommand` with the window id path segment.
+
+The window id is a path segment after `IO`, not a query parameter. All other methods, paths, and malformed `IO` suffixes return HTTP 404 with a text response. Successful IO command parsing returns `Queued`; this means the command was accepted and posted to the UI thread, not that every visible effect has already finished. Syntax errors and command errors are returned synchronously as text beginning with `!`.
+
+## Starting The Service
+
+Call `StartWindowsHttpAutomationService` from `GuiMain`, after the setup function has installed the current native controller and before entering the application event loop. Call `StopWindowsHttpAutomationService` during shutdown when the service lifetime is not already stopped through `INativeAutomationService::Stop`.
+
+A normal Windows application can start the service before `GetApplication()->Run`:
+```c++
+#include "../../../Source/PlatformProviders/Windows/WinNativeWindow.h"
+
+using namespace vl;
+using namespace vl::presentation;
+using namespace vl::presentation::controls;
+
+void GuiMain()
+{
+ demo::MainWindow window;
+ window.ForceCalculateSizeImmediately();
+ window.MoveToScreenCenter();
+
+ windows::StartWindowsHttpAutomationService(
+ WString::Unmanaged(L"Automation/MyApp"),
+ 8888);
+ GetApplication()->Run(&window);
+ windows::StopWindowsHttpAutomationService();
+}
+
+int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
+{
+ return SetupHostedWindowsDirect2DRenderer();
+}
+```
+
+Repeated calls do not create multiple listeners. The Windows implementation keeps one process-wide HTTP service until `StopWindowsHttpAutomationService` or `INativeAutomationService::Stop` stops it.
+
+## Setup Function Cases
+
+The setup function decides which controller and service are active while `GuiMain` runs. Use the following cases when deciding whether user code must substitute another automation service:
+- `SetupWindowsGDIRenderer`: installs `WindowsAutomationService`. Use `StartWindowsHttpAutomationService` directly for multi-window control tree and IO. The DOM route is normally unavailable.
+- `SetupWindowsDirect2DRenderer`: same automation behavior as `SetupWindowsGDIRenderer`, with the Direct2D renderer.
+- `SetupHostedWindowsGDIRenderer`: installs `WindowsAutomationServiceHosted`. Use the HTTP service directly. IO should use `/IO` without a window id because hosted sub windows and popups are represented under the main window.
+- `SetupHostedWindowsDirect2DRenderer`: same automation behavior as `SetupHostedWindowsGDIRenderer`, with the Direct2D renderer.
+- `SetupRawWindowsGDIRenderer`: installs `WindowsAutomationService` for the raw native window controller. If the raw process is a remote protocol renderer and owns a `GuiRemoteRendererSingle`, substitute `WindowsAutomationServiceRenderer` to expose renderer DOM and renderer-side IO.
+- `SetupRawWindowsDirect2DRenderer`: same automation behavior as `SetupRawWindowsGDIRenderer`, with the Direct2D renderer.
+- `SetupRemoteNativeController`: the remote controller itself does not return an automation service. Substitute `RemoteProtocolAutomationService` around `GetApplication()->Run` when the remote core should expose the hosted control tree and core-side IO.
+- `SetupGacGenNativeController`: this setup is for generation-time resource processing, not an interactive UI session. It does not provide an automation service for HTTP control.
+- `SetupGtkRenderer`: do not call the Windows HTTP helper. A Gtk port must provide its own endpoint layer and automation service implementation if it needs coding-agent automation.
+- `SetupWGacRenderer`: do not call the Windows HTTP helper. A Wayland port must provide its own endpoint layer and automation service implementation if it needs coding-agent automation.
+- `SetupWGacHostedRenderer`: same requirement as `SetupWGacRenderer`, but the service should follow hosted-mode window-id behavior if it exposes hosted windows.
+
+## Substituting a Service
+
+Use `GetNativeServiceSubstitution()->Substitute(service, false)` before the automation service is first requested. The substitution layer rejects a late substitution after a service has already been used. Keep the substituted object alive until it is unsubstituted.
+
+A remote protocol core can expose the core-side automation surface like this:
+```c++
+void GuiMain()
+{
+ RemoteProtocolAutomationService automationService;
+ GetNativeServiceSubstitution()->Substitute(&automationService, false);
+ windows::StartWindowsHttpAutomationService(
+ WString::Unmanaged(L"Automation/RemoteCore"),
+ 8888);
+
+ GetApplication()->Run(mainWindow);
+
+ windows::StopWindowsHttpAutomationService();
+ GetNativeServiceSubstitution()->Unsubstitute(&automationService);
+}
+```
+
+A remote protocol renderer that owns a `GuiRemoteRendererSingle` can substitute `WindowsAutomationServiceRenderer` in the same scope before starting the HTTP service. This is the case where `GET /Dom` becomes meaningful.
+
+## Implementing Another Platform
+
+A platform implementation should implement `INativeAutomationService` or reuse `AutomationServiceBase` from `Utilities/SharedServices`. Return true from `Available`, implement the supported `Can...` and operation pairs, and make `Stop` disable all future operations.
+
+When implementing IO:
+- Parse the command synchronously on the request path so malformed commands return an immediate error.
+- Queue the parsed command to the UI thread instead of running arbitrary UI work on the HTTP or transport thread.
+- Return `Queued` after the parsed command is accepted.
+- Use `RunIOCommandOnNativeWindow` when the platform can map a window id to an `INativeWindow` and its listener list.
+
+The Windows HTTP wrapper is only one endpoint layer. Other platforms may expose the same URL contract, a stdio protocol, an in-process function-call bridge, or another transport, as long as the transport calls the same `INativeAutomationService` operations on the correct threads.
+
+## Operational Notes
+
+Application-level automation depends on the GacUI UI thread. A native crash dialog, file dialog, or other modal native window can block the UI thread and keep the HTTP endpoint from answering. In that situation, inspect and operate native windows from another process using Win32 APIs, then return to the automation endpoint after the modal window is closed.
+
+Do not use operating-system UI Automation as the fallback for GacUI automation on Windows. It can fail when the screen is locked, and it is not the contract implemented by `AutomationService`.
+
diff --git a/.github/KnowledgeBase/manual/gacui/components/components/colordialog.md b/.github/KnowledgeBase/manual/gacui/components/components/colordialog.md
index f0f80bf7..5ceb357d 100644
--- a/.github/KnowledgeBase/manual/gacui/components/components/colordialog.md
+++ b/.github/KnowledgeBase/manual/gacui/components/components/colordialog.md
@@ -1,34 +1,34 @@
# \
-**\**displays a OS native color dialog.
+**\** displays a OS native color dialog.
## Input / Output Properties
-Set these properties before calling**ShowDialog**to create a default user input. These properties will be changed after calling**ShowDialog**if the user change the default input.
+Set these properties before calling **ShowDialog** to create a default user input. These properties will be changed after calling **ShowDialog** if the user change the default input.
### SelectedColor
-This property defines the selected color. If**ShowDialog**returns**false**, the value of this property is undefined.
+This property defines the selected color. If **ShowDialog** returns **false**, the value of this property is undefined.
## Input Properties
-Set these properties before calling**ShowDialog**to define the content of the dialog.
+Set these properties before calling **ShowDialog** to define the content of the dialog.
### EnabledCustomColor
-Set this property to**true**to enable an extended area, allowing the user to choose a color that is not in the predefined color list.
+Set this property to **true** to enable an extended area, allowing the user to choose a color that is not in the predefined color list.
### OpenedCustomColor
-Set this property to**true**to display the custom color area by default. Otherwise the area is collapsed, but the user could still open it in the dialog.
+Set this property to **true** to display the custom color area by default. Otherwise the area is collapsed, but the user could still open it in the dialog.
## ShowDialog Method
-Call this function to display a dialog, and return**true**if a color is selected.
+Call this function to display a dialog, and return **true** if a color is selected.
## Output Properties
-Read these properties after calling**ShowDialog**for user input.
+Read these properties after calling **ShowDialog** for user input.
### CustomColors
diff --git a/.github/KnowledgeBase/manual/gacui/components/components/fontdialog.md b/.github/KnowledgeBase/manual/gacui/components/components/fontdialog.md
index 52106f32..b6153c2a 100644
--- a/.github/KnowledgeBase/manual/gacui/components/components/fontdialog.md
+++ b/.github/KnowledgeBase/manual/gacui/components/components/fontdialog.md
@@ -1,36 +1,36 @@
# \
-**\**displays a OS native font dialog.
+**\** displays a OS native font dialog.
## Input / Output Properties
-Set these properties before calling**ShowDialog**to create a default user input. These properties will be changed after calling**ShowDialog**if the user change the default input.
+Set these properties before calling **ShowDialog** to create a default user input. These properties will be changed after calling **ShowDialog** if the user change the default input.
### SelectedFont
-This property defines the selected font. If**ShowDialog**returns**false**, the value of this property is undefined.
+This property defines the selected font. If **ShowDialog** returns **false**, the value of this property is undefined.
### SelectedColor
-This property defines the selected color. If**ShowDialog**returns**false**, the value of this property is undefined.
+This property defines the selected color. If **ShowDialog** returns **false**, the value of this property is undefined.
## Input Properties
-Set these properties before calling**ShowDialog**to define the content of the dialog.
+Set these properties before calling **ShowDialog** to define the content of the dialog.
### ShowSelection
-Set this property to**true**to highlight the**SelectedFont**and**SelectedColor**.
+Set this property to **true** to highlight the **SelectedFont** and **SelectedColor**.
### ShowEffect
-Set this property to**true**to enable the font review area.
+Set this property to **true** to enable the font review area.
### ForceFontExist
-Set this property to**true**to ensure user cannot select an unexisting font.
+Set this property to **true** to ensure user cannot select an unexisting font.
## ShowDialog Method
-Call this function to display a dialog, and return**true**if a font is selected.
+Call this function to display a dialog, and return **true** if a font is selected.
diff --git a/.github/KnowledgeBase/manual/gacui/components/components/messagedialog.md b/.github/KnowledgeBase/manual/gacui/components/components/messagedialog.md
index 7d91b37f..dc2c737b 100644
--- a/.github/KnowledgeBase/manual/gacui/components/components/messagedialog.md
+++ b/.github/KnowledgeBase/manual/gacui/components/components/messagedialog.md
@@ -1,10 +1,10 @@
# \
-**\**displays a OS native message dialog.
+**\** displays a OS native message dialog.
## Input Properties
-Set these properties before calling**ShowDialog**to define the content of the dialog.
+Set these properties before calling **ShowDialog** to define the content of the dialog.
### Input
@@ -38,7 +38,7 @@ The value of this property must be one of the followuing values:
The value of this property must be one of the followuing values:
- **ModalWindow**: The current window is disabled until the dialog is closed.
- **ModalTask**: All window of the current application is disabled until the dialog is closed.
-- **ModalSystem**: Same as**ModelTask**and the dialog is set to top-most.
+- **ModalSystem**: Same as **ModelTask** and the dialog is set to top-most.
### Text
diff --git a/.github/KnowledgeBase/manual/gacui/components/components/openfiledialog.md b/.github/KnowledgeBase/manual/gacui/components/components/openfiledialog.md
index d8f19c59..8d170f57 100644
--- a/.github/KnowledgeBase/manual/gacui/components/components/openfiledialog.md
+++ b/.github/KnowledgeBase/manual/gacui/components/components/openfiledialog.md
@@ -1,18 +1,18 @@
# \
-**\**displays a OS native open file dialog.
+**\** displays a OS native open file dialog.
## Input / Output Properties
-Set these properties before calling**ShowDialog**to create a default user input. These properties will be changed after calling**ShowDialog**if the user change the default input.
+Set these properties before calling **ShowDialog** to create a default user input. These properties will be changed after calling **ShowDialog** if the user change the default input.
### FileName
-This property defines the full path of the selected file. If**ShowDialog**returns**false**, the value of this property is undefined.
+This property defines the full path of the selected file. If **ShowDialog** returns **false**, the value of this property is undefined.
## Input Properties
-Set these properties before calling**ShowDialog**to define the content of the dialog.
+Set these properties before calling **ShowDialog** to define the content of the dialog.
### Filter
@@ -22,17 +22,17 @@ Pattern names and wildcards in a filter are splitted by "|". For example, a filt
```
Text Files (*.txt)|*.txt|All Files (*.*)|*.*
```
-This filter defines two filters:
+ This filter defines two filters:
- **Text Files (*.txt)**: its wildcard is *.txt
- **All Files (*.*)**: its wildcard is *.*
### FilterIndex
-This property defines the default selected filter, starting from**0**.
+This property defines the default selected filter, starting from **0**.
### EnabledPreview
-Set this property to**true**to enable the preview area. When a file is selected, its content will be displayed in the preview area.
+Set this property to **true** to enable the preview area. When a file is selected, its content will be displayed in the preview area.
### Title
@@ -46,9 +46,9 @@ This property defines the default folder of the dialog.
This property defines the default extension of the dialog.
-If a file is selected by manually entering a file name, the**DefaultExtension**will be appended after the file name if the file extension is not entered.
+If a file is selected by manually entering a file name, the **DefaultExtension** will be appended after the file name if the file extension is not entered.
-**IMPORTANT**: The value of the**DefaultExtension**property does not include the "." character. For example, an extension for text files is**txt**, instead of**.txt**.
+**IMPORTANT**: The value of the **DefaultExtension** property does not include the "." character. For example, an extension for text files is **txt**, instead of **.txt**.
### Options
@@ -56,7 +56,7 @@ The value of this property must be one of the following values, or multiple valu
- **FileDialogAllowMultipleSelection**: Allow multiple selection.
- **FileDialogFileMustExist**: Prevent the user to select unexisting files.
- **FileDialogShowReadOnlyCheckBox**: Show the "Read Only" check box.
-- **FileDialogDereferenceLinks**: Dereference link files.**FileName**and**FileNames**will contain the full path of actual files.
+- **FileDialogDereferenceLinks**: Dereference link files. **FileName** and **FileNames** will contain the full path of actual files.
- **FileDialogShowNetworkButton**: Show the "Network" button to allow selection of objects across the network.
- **FileDialogPromptCreateFile**: Prompt if a new file is going to be created.
- **FileDialogPromptOverwriteFile**: Promt if a existing file is going to be overwritten.
@@ -65,13 +65,13 @@ The value of this property must be one of the following values, or multiple valu
## ShowDialog Method
-Call this function to display a dialog, and return**true**if a file is selected.
+Call this function to display a dialog, and return **true** if a file is selected.
## Output Properties
-Read these properties after calling**ShowDialog**for user input.
+Read these properties after calling **ShowDialog** for user input.
### FileNames
-This property returns full paths of all selected files. If**ShowDialog**returns**false**, the value of this property is undefined.
+This property returns full paths of all selected files. If **ShowDialog** returns **false**, the value of this property is undefined.
diff --git a/.github/KnowledgeBase/manual/gacui/components/components/savefiledialog.md b/.github/KnowledgeBase/manual/gacui/components/components/savefiledialog.md
index a41ef5c6..94535603 100644
--- a/.github/KnowledgeBase/manual/gacui/components/components/savefiledialog.md
+++ b/.github/KnowledgeBase/manual/gacui/components/components/savefiledialog.md
@@ -1,6 +1,6 @@
# \
-**\**displays a OS native save file dialog.
+**\** displays a OS native save file dialog.
-**\**shares all properties and methods with[ ](../../.././gacui/components/components/openfiledialog.md), except that the**FileNames**property does not exist in**\**.
+**\** shares all properties and methods with [ ](../../.././gacui/components/components/openfiledialog.md), except that the **FileNames** property does not exist in **\**.
diff --git a/.github/KnowledgeBase/manual/gacui/components/compositions/bounds.md b/.github/KnowledgeBase/manual/gacui/components/compositions/bounds.md
index dacc5d15..0259bdc2 100644
--- a/.github/KnowledgeBase/manual/gacui/components/compositions/bounds.md
+++ b/.github/KnowledgeBase/manual/gacui/components/compositions/bounds.md
@@ -1,30 +1,29 @@
# \
-**\**is able to set a relative position directly. But usually this composition is used when you just need to have a composition.
+**\** is able to set a relative position directly. But usually this composition is used when you just need to have a composition.
-Three properties are provided by**\**:
+Three properties are provided by **\**:
## ExpectedBounds
To set a relative position, the default value is 0 for all its components.
-**IMPORTANT**: The relative position of a composition does not always listen to the value of**ExpectedBounds**.
+**IMPORTANT**: The relative position of a composition does not always listen to the value of **ExpectedBounds**.
-**ExpectedBounds**is only a suggestion. If any component of**AlignmentToParent**is not**-1**, the result will be affected accordingly.
+**ExpectedBounds** is only a suggestion. If any component of **AlignmentToParent** is not **-1**, the result will be affected accordingly.
-The size of**ExpectedBounds**limits the composition's minimum size.
+The size of **ExpectedBounds** limits the composition's minimum size.
-Please check out[this page](../../.././gacui/components/compositions/home.md)for more information.
+Please check out [this page](../../.././gacui/components/compositions/home.md) for more information.
## AlignmentToParent
-**AlignmentToParent**is added for all compositions that can control the relative position by themselves. The position of**\**and**\**are completely decided by**\**and**\**,**AlignmentToParent**does not exist in these compositions.
+**AlignmentToParent** is added for all compositions that can control the relative position by themselves. The position of **\** and **\** are completely decided by **\** and **\**, **AlignmentToParent** does not exist in these compositions.
-Please check out[this page](../../.././gacui/components/compositions/home.md)for more information.
+Please check out [this page](../../.././gacui/components/compositions/home.md) for more information.
## Sample
-
-- Source code:[layout_bounds](https://github.com/vczh-libraries/Release/blob/master/SampleForDoc/GacUI/XmlRes/layout_bounds/Resource.xml)
+- Source code: [layout_bounds](https://github.com/vczh-libraries/Release/blob/master/SampleForDoc/GacUI/XmlRes/layout_bounds/Resource.xml)
- 
diff --git a/.github/KnowledgeBase/manual/gacui/components/compositions/events.md b/.github/KnowledgeBase/manual/gacui/components/compositions/events.md
index c4172258..b9664374 100644
--- a/.github/KnowledgeBase/manual/gacui/components/compositions/events.md
+++ b/.github/KnowledgeBase/manual/gacui/components/compositions/events.md
@@ -1,15 +1,15 @@
# Handling Input Events
-Raw input events are in compositions. Normally a composition doesn't receive events, until**GuiGraphicsComposition**::**GetEventReceiver**is called. This function create a big object containing all event registrations inside it, and cause**GuiGraphicsComposition**::**HasEventReceiver**to become**true**forever. You are not able to free the space of event registration object once it is associated to a composition.
+Raw input events are in compositions. Normally a composition doesn't receive events, until **GuiGraphicsComposition**::**GetEventReceiver** is called. This function create a big object containing all event registrations inside it, and cause **GuiGraphicsComposition**::**HasEventReceiver** to become **true** forever. You are not able to free the space of event registration object once it is associated to a composition.
-In the event registration object you will find a lot of fields for events, for example,**leftButtonDown**. There are 3 methods for subscribing an event:
+In the event registration object you will find a lot of fields for events, for example, **leftButtonDown**. There are 3 methods for subscribing an event:
- composition-\>GetEventReceiver()-\>EVENT_NAME.**AttachMethod**: subscribe an event using an object and a member function pointer.
-- composition-\>GetEventReceiver()-\>EVENT_NAME.**AttachFunction**: subscribe an event using a function pointer or a**vl::Func\<...\>**functor.
-- composition-\>GetEventReceiver()-\>EVENT_NAME.**AttachLambda**: subscribe an event using a lambda expression or other functors.All 3 methods returns a new handler object per each call. The only purpose for this object is to use in composition-\>GetEventReceiver()-\>EVENT_NAME.**Detach**and cancel the registration that returning that perticular handler object. If**Detach**returns**false**, either this registration has already been canceled, or this registration doesn't happen in this event.
+- composition-\>GetEventReceiver()-\>EVENT_NAME.**AttachFunction**: subscribe an event using a function pointer or a **vl::Func\<...\>** functor.
+- composition-\>GetEventReceiver()-\>EVENT_NAME.**AttachLambda**: subscribe an event using a lambda expression or other functors. All 3 methods returns a new handler object per each call. The only purpose for this object is to use in composition-\>GetEventReceiver()-\>EVENT_NAME.**Detach** and cancel the registration that returning that perticular handler object. If **Detach** returns **false**, either this registration has already been canceled, or this registration doesn't happen in this event.
-In the event callback function, the first argument is always**GuiGraphicsComposition***which is the owner of the event registration object, the second argument varies in different events.
+In the event callback function, the first argument is always **GuiGraphicsComposition*** which is the owner of the event registration object, the second argument varies in different events.
-In GacUI XML Resource, raw input events are treated like attributes of a composition. You can either specify a method name of the current instance, or specify a piece of code to run. Please check out[this page](../../.././gacui/xmlres/instance/events.md)for details.
+In GacUI XML Resource, raw input events are treated like attributes of a composition. You can either specify a method name of the current instance, or specify a piece of code to run. Please check out [this page](../../.././gacui/xmlres/instance/events.md) for details.
## Events and Parent Chain
@@ -17,8 +17,8 @@ Most of the events are not only raised on the composition that receives the inpu
Such process could be detected using members of the second argument:
- **compositionSource**: the composition right under the mouse, which is the original event raiser. When the event raises through the parent chain, this member doesn't change.
-- **eventSource**: If the**compositionSource**has an associated event registration object,**eventSource**is**compositionSource**. Otherwise,**eventSource**is the nearest parent composition that has an associated event registration object.
-- **handled**: you can set this member in the event callback function to**true**to stop the event from going through more further in the parent chain.Meanwhile, the first argument is the composition who owns the event registration object the callback function is registered to. When the event raises through the parent chain, the first argument becomes the current "parent".
+- **eventSource**: If the **compositionSource** has an associated event registration object, **eventSource** is **compositionSource**. Otherwise, **eventSource** is the nearest parent composition that has an associated event registration object.
+- **handled**: you can set this member in the event callback function to **true** to stop the event from going through more further in the parent chain. Meanwhile, the first argument is the composition who owns the event registration object the callback function is registered to. When the event raises through the parent chain, the first argument becomes the current "parent".
## Mouse Events
@@ -35,19 +35,19 @@ GacUI offers the following button events:
- rightButtonUp
- rightButtonDoubleClick
- horizontalWheel
-- verticalWheelmapping to the 5 standard buttons of a mouse. But a typical mouse today, middle button and vertical wheel are merged together, horizontal wheel are usually missing.
+- verticalWheel mapping to the 5 standard buttons of a mouse. But a typical mouse today, middle button and vertical wheel are merged together, horizontal wheel are usually missing.
-The type of the second argument is**vl::presentation::compositions::GuiMouseEventArgs&**, or**presentation::composition::GuiMouseEventArgs***in**Workflow**.
+The type of the second argument is **vl::presentation::compositions::GuiMouseEventArgs&**, or **presentation::composition::GuiMouseEventArgs*** in **Workflow**.
-Mouse button and wheel events are raised on captured composition, or the composition right under the mouse when no composition is captured, and then go through the parent chain, which is stoppable by setting**handled**to**true**.
+Mouse button and wheel events are raised on captured composition, or the composition right under the mouse when no composition is captured, and then go through the parent chain, which is stoppable by setting **handled** to **true**.
Other members contains the information of the event:
-- **ctrl**:**true**if the CTRL key is pressing.
-- **shift**:**true**if the SHIFT key is pressing.
-- **left**:**true**if the mouse left button is pressing.
-- **middle**:**true**if the mouse middle button is pressing.
-- **right**:**true**if the mouse right button is pressing.
-- **x**and**y**: the relative coordinate to**first callback argument**.
+- **ctrl**: **true** if the CTRL key is pressing.
+- **shift**: **true** if the SHIFT key is pressing.
+- **left**: **true** if the mouse left button is pressing.
+- **middle**: **true** if the mouse middle button is pressing.
+- **right**: **true** if the mouse right button is pressing.
+- **x** and **y**: the relative coordinate to **first callback argument**.
- **wheel**: direction and distance of the wheel. A positive number means the wheel is rotating towards right or down. The unit of the rotation is 120 for today's typical mouse.
### Moving Events
@@ -55,27 +55,27 @@ Other members contains the information of the event:
GacUI offers the following button events:
- mouseMove
- mouseEnter
-- mouseLeavemapping to the 5 standard buttons of a mouse. But a typical mouse today, middle button and vertical wheel are merged together, horizontal wheel are usually missing.
+- mouseLeave mapping to the 5 standard buttons of a mouse. But a typical mouse today, middle button and vertical wheel are merged together, horizontal wheel are usually missing.
-**mouseEnter**happens when the mouse moves into a composition.**mouseLeave**happens when the mouse moves out of a composition. When a mouse moves from one composition to its child composition, it doesn't count as leaving the original composition, it is still in the original composition and its child composition.
+**mouseEnter** happens when the mouse moves into a composition. **mouseLeave** happens when the mouse moves out of a composition. When a mouse moves from one composition to its child composition, it doesn't count as leaving the original composition, it is still in the original composition and its child composition.
-**mouseMove**happens when the mouse moves. It is raised on captured composition, or the composition right under the mouse when no composition is captured, and then go through the parent chain, which is stoppable by setting**handled**to**true**.
+**mouseMove** happens when the mouse moves. It is raised on captured composition, or the composition right under the mouse when no composition is captured, and then go through the parent chain, which is stoppable by setting **handled** to **true**.
### Capturing
-When a button down event happens, the**compositionSource**is captured. A captured composition becomes the**compositionSource**of all following mouse events happen in the containing window (or menu, popup, etc...), including button up events.
+When a button down event happens, the **compositionSource** is captured. A captured composition becomes the **compositionSource** of all following mouse events happen in the containing window (or menu, popup, etc...), including button up events.
After the button up event happens, the capturing is released.
### Moving or deleting controls or compositions during mouse events.
-Some times you may want to change the control tree structure in a callback of mouse events, (including**Clicked**in buttons).
+Some times you may want to change the control tree structure in a callback of mouse events, (including **Clicked** in buttons).
-This is tricky because, mouse events are not just sent to this composition, it is sent to all its parent compositions. Even when**handled**is set to**true**, there is still something to do after the callback function ends.
+This is tricky because, mouse events are not just sent to this composition, it is sent to all its parent compositions. Even when **handled** is set to **true**, there is still something to do after the callback function ends.
-When you move or delete controls or compositions that affect the parent chain,**GacUI will stably CRASH**.
+When you move or delete controls or compositions that affect the parent chain, **GacUI will stably CRASH**.
-In order to solve this issue,**GetApplication()-\>InvokeInMainThread**is your friend. Whenever you call this function, the callback to**InvokeInMainThread**will run right after the current series of events. That is a very safe point to restructure your controls or compositions.
+In order to solve this issue, **GetApplication()-\>InvokeInMainThread** is your friend. Whenever you call this function, the callback to **InvokeInMainThread** will run right after the current series of events. That is a very safe point to restructure your controls or compositions.
For example, if you customize the tab control to have a close button in each tab page:
```
@@ -91,7 +91,6 @@ void MyTabPage::buttonCloseClicked(GuiGraphicsComposition* sender, GuiEventArgs&
}
```
-
## Focus Events
GacUI offers the following button events:
@@ -99,17 +98,17 @@ GacUI offers the following button events:
- lostFocus
- caretNotify
-The type of the second argument is**vl::presentation::compositions::GuiEventArgs&**, or**presentation::composition::GuiEventArgs***in**Workflow**.
+The type of the second argument is **vl::presentation::compositions::GuiEventArgs&**, or **presentation::composition::GuiEventArgs*** in **Workflow**.
-A focus composition is the**FocusableComposition**of a control that has focus. Control like buttons will take focus after it is clicked, you can also call**SetFocus**to move focus to a control.
+A focus composition is the **FocusableComposition** of a control that has focus. Control like buttons will take focus after it is clicked, you can also call **SetFocus** to move focus to a control.
-When a control get its focus, its**FocusableComposition**has the focus. If you are writing a control template, you can set any composition to the**FocusableComposition**property of the control template, and it becomes the**FocusableComposition**of the control.
+When a control get its focus, its **FocusableComposition** has the focus. If you are writing a control template, you can set any composition to the **FocusableComposition** property of the control template, and it becomes the **FocusableComposition** of the control.
-A window has only one focused control.**gotFocus**raises on a composition when it is focused.**lostFocus**raises on a previous focused composition when it lost the focus.
+A window has only one focused control. **gotFocus** raises on a composition when it is focused. **lostFocus** raises on a previous focused composition when it lost the focus.
-**caretNotify**is keep raising on the focused control every half second. If a control wants to render an input caret, it needs to subscribe to**caretNotify**, and than changing the input caret between visible and invisible state when this event happens.
+**caretNotify** is keep raising on the focused control every half second. If a control wants to render an input caret, it needs to subscribe to **caretNotify**, and than changing the input caret between visible and invisible state when this event happens.
-COMPOSITION-\>**GetRelatedGraphicsHost**()-\>**SetCaretPoint**is useful to tell the system where to show the little window for the input method. This function is strongly recommended to be called by the focused control to avoid state corruption.
+COMPOSITION-\>**GetRelatedGraphicsHost**()-\>**SetCaretPoint** is useful to tell the system where to show the little window for the input method. This function is strongly recommended to be called by the focused control to avoid state corruption.
If the window itself gets or loses focus, related events are raised on the window, events described here are not affected.
@@ -120,20 +119,20 @@ GacUI offers the following button events:
- keyDown
- keyUp
-The type of the second argument is**vl::presentation::compositions::GuiKeyEventArgs&**, or**presentation::composition::GuiKeyEventArgs***in**Workflow**.
+The type of the second argument is **vl::presentation::compositions::GuiKeyEventArgs&**, or **presentation::composition::GuiKeyEventArgs*** in **Workflow**.
-Keyboard events are raised on the focused composition, and then go through the parent chain, which is stoppable by setting**handled**to**true**.
+Keyboard events are raised on the focused composition, and then go through the parent chain, which is stoppable by setting **handled** to **true**.
-**previewKey**is raised before any other keyboard events. If**handled**is set to**true**, not only the parent chain will stop, the following keyboard event will also be canceled.
+**previewKey** is raised before any other keyboard events. If **handled** is set to **true**, not only the parent chain will stop, the following keyboard event will also be canceled.
-**code**member of the second argument maps to an item in**vl::presentation::VKEY**enum.
+**code** member of the second argument maps to an item in **vl::presentation::VKEY** enum.
Other members contains the information of the event:
-- **ctrl**:**true**if the CTRL key is pressing.
-- **shift**:**true**if the SHIFT key is pressing.
-- **alt**:**true**if the ALT button is pressing.
-- **capslock**:**true**if the CAPSLOCK button is activated.
-- **autoRepeatKeyDown**:**true**if this event is generated because of holding a key.
+- **ctrl**: **true** if the CTRL key is pressing.
+- **shift**: **true** if the SHIFT key is pressing.
+- **alt**: **true** if the ALT button is pressing.
+- **capslock**: **true** if the CAPSLOCK button is activated.
+- **autoRepeatKeyDown**: **true** if this event is generated because of holding a key.
## Input Events
@@ -141,19 +140,19 @@ GacUI offers the following button events:
- previewCharInput
- charInput
-The type of the second argument is**vl::presentation::compositions::GuiCharEventArgs&**, or**presentation::composition::GuiCharEventArgs***in**Workflow**.
+The type of the second argument is **vl::presentation::compositions::GuiCharEventArgs&**, or **presentation::composition::GuiCharEventArgs*** in **Workflow**.
-Input events are raised on the focused composition, and then go through the parent chain, which is stoppable by setting**handled**to**true**.
+Input events are raised on the focused composition, and then go through the parent chain, which is stoppable by setting **handled** to **true**.
-**previewCharInput**is raised before any other keyboard events. If**handled**is set to**true**, not only the parent chain will stop, the following keyboard event will also be canceled.
+**previewCharInput** is raised before any other keyboard events. If **handled** is set to **true**, not only the parent chain will stop, the following keyboard event will also be canceled.
-**code**member of the second argument is a**wchar_t**that being typed into the control. In Windows,**wchar_t**is a UTF-16 code point. In other platform,**wchar_t**is a UTF-32 code point.
+**code** member of the second argument is a **wchar_t** that being typed into the control. In Windows, **wchar_t** is a UTF-16 code point. In other platform, **wchar_t** is a UTF-32 code point.
Other members contains the information of the event:
-- **ctrl**:**true**if the CTRL key is pressing.
-- **shift**:**true**if the SHIFT key is pressing.
-- **alt**:**true**if the ALT button is pressing.
-- **capslock**:**true**if the CAPSLOCK button is activated.
+- **ctrl**: **true** if the CTRL key is pressing.
+- **shift**: **true** if the SHIFT key is pressing.
+- **alt**: **true** if the ALT button is pressing.
+- **capslock**: **true** if the CAPSLOCK button is activated.
## Other Events
@@ -161,11 +160,11 @@ GacUI offers the following button events:
- clipboardNotify
- renderTargetChanged
-The type of the second argument is**vl::presentation::compositions::GuiEventArgs&**, or**presentation::composition::GuiEventArgs***in**Workflow**.
+The type of the second argument is **vl::presentation::compositions::GuiEventArgs&**, or **presentation::composition::GuiEventArgs*** in **Workflow**.
-When content in the system clipboard changes,**clipboardNotify**raises on every compositions.
+When content in the system clipboard changes, **clipboardNotify** raises on every compositions.
-When the render target is changed, this may because a composition is added to or remove from a window, or the window itself loses and recreates its render target,**renderTargetChanged**raises on the affected root composition and all direct or indirect child compositions.
+When the render target is changed, this may because a composition is added to or remove from a window, or the window itself loses and recreates its render target, **renderTargetChanged** raises on the affected root composition and all direct or indirect child compositions.
-If a composition is not added to a window, its render target is**null**.
+If a composition is not added to a window, its render target is **null**.
diff --git a/.github/KnowledgeBase/manual/gacui/components/compositions/flow.md b/.github/KnowledgeBase/manual/gacui/components/compositions/flow.md
index 62241d49..428950b8 100644
--- a/.github/KnowledgeBase/manual/gacui/components/compositions/flow.md
+++ b/.github/KnowledgeBase/manual/gacui/components/compositions/flow.md
@@ -1,85 +1,85 @@
# \ and \
-**\**arrange all direct children**\**compositions in multiple rows with auto line wrapping.
+**\** arrange all direct children **\** compositions in multiple rows with auto line wrapping.
-**\**::MinSizeLimitation is**LimitToElementAndChildren**by default.
+**\**::MinSizeLimitation is **LimitToElementAndChildren** by default.
## Properties
-A few more properties are provided by**\**and**\**to control the details of how to ordering**\**.
+A few more properties are provided by **\** and **\** to control the details of how to ordering **\**.
-**\**is not a**\**, there is no writable**ExpectedBounds**and**AlignmentToParent**in**\**.
+**\** is not a **\**, there is no writable **ExpectedBounds** and **AlignmentToParent** in **\**.
### \::Axis
-The default value is**\**, which equivalents to**\**.
+The default value is **\**, which equivalents to **\**.
-**LeftDown**,**RightDown**,**LeftUp**,**RightUp**,**DownLeft**,**DownRight**,**UpLeft**and**UpRight**are all valid values for the**AxisDirection**property.
+**LeftDown**, **RightDown**, **LeftUp**, **RightUp**, **DownLeft**, **DownRight**, **UpLeft** and **UpRight** are all valid values for the **AxisDirection** property.
-Among these values, the first word describes the direction how**\**are line up one by one, the second word describes the direction how auto line wrapping does. For example,**RightDown**means the next item is put on the**right**side of the previous item, and when there is no more space for this item in the current row, it creates a new row on the**down**side of the current row.
+Among these values, the first word describes the direction how **\** are line up one by one, the second word describes the direction how auto line wrapping does. For example, **RightDown** means the next item is put on the **right** side of the previous item, and when there is no more space for this item in the current row, it creates a new row on the **down** side of the current row.
### \::Alignment
-The default value is**Left**.
+The default value is **Left**.
-**Left**,**Center**,**Right**and**Extend**are all valid values for the this property.
+**Left**, **Center**, **Right** and **Extend** are all valid values for the this property.
-This property describes how**\**are positioned in one row.
+This property describes how **\** are positioned in one row.
### \::RowPadding and \::ColumnPadding
The default value is 0.
-This property keeps an distance between each**\**.
+This property keeps an distance between each **\**.
-**IMPORTANT**:**Row**here doesn't necessary mean a line in horizontal direction, it depends on the value of the**Axis**property.
+**IMPORTANT**: **Row** here doesn't necessary mean a line in horizontal direction, it depends on the value of the **Axis** property.
### \::ExtraMargin
The default value is 0 for all its components.
-This property keeps an distance between**\**and**\**.
+This property keeps an distance between **\** and **\**.
### \::ExtraMargin
The default value is 0 for all its components.
-This property adds a border to a**\**.
+This property adds a border to a **\**.
-**IMPORTANT**:**ExtraMargin**does not affect how**other \**is positioned. Instead, after the position of a**\**is decided,**ExtraMargin**kicks in and add a border to enlarge it.
+**IMPORTANT**: **ExtraMargin** does not affect how **other \** is positioned. Instead, after the position of a **\** is decided, **ExtraMargin** kicks in and add a border to enlarge it.
-Adding an**ExtraMargin**to a**\**does not increase the minimum size of its parent**\**.
+Adding an **ExtraMargin** to a **\** does not increase the minimum size of its parent **\**.
### \::FlowOption
-The default value is**baseline:FromBottom distance:0**.
+The default value is **baseline:FromBottom distance:0**.
-This property describes how**\**are positioned in one row.
+This property describes how **\** are positioned in one row.
-**baseline**could be**FromTop**,**FromBottom**or**Percentage**:
-- **FromTop**: the**\**keeps the**distance**from the top of the row.
-- **FromBottom**: the**\**keeps the**distance**from the bottom of the row.
-- **Percentage**: the**\**keeps the distahce, which is**pencentage**of its height, from the top of the row.
+**baseline** could be **FromTop**, **FromBottom** or **Percentage**:
+- **FromTop**: the **\** keeps the **distance** from the top of the row.
+- **FromBottom**: the **\** keeps the **distance** from the bottom of the row.
+- **Percentage**: the **\** keeps the distahce, which is **pencentage** of its height, from the top of the row.
-**IMPORTANT**:**Top**here doesn't necessary mean the top border of a row, it depends on the value of the**Axis**property.
+**IMPORTANT**: **Top** here doesn't necessary mean the top border of a row, it depends on the value of the **Axis** property.
## Adding Flow Items
### \::Children()
-When a new**\**is added to**\**as a child, this**\**is always appended to the end of the last row, regardless of its position in**\::Children**.
+When a new **\** is added to **\** as a child, this **\** is always appended to the end of the last row, regardless of its position in **\::Children**.
### \::InsertFlowItem(index, item)
-To control the position of a**\**in the auto-wrapped line, call**\::InsertFlowItem()**instead of**\::Children()**.
+To control the position of a **\** in the auto-wrapped line, call **\::InsertFlowItem()** instead of **\::Children()**.
-This function also adds a**\**to the**\**, but it allows the position of this**\**in the auto-wrapped line to be specified, instead of adding it to the end of the last row.
+This function also adds a **\** to the **\**, but it allows the position of this **\** in the auto-wrapped line to be specified, instead of adding it to the end of the last row.
### \::GetFlowItems()
-Call this function to get all direct children**\**in the line order.
+Call this function to get all direct children **\** in the line order.
## Sample
-Please check out[this tutorial project](https://github.com/vczh-libraries/Release/tree/master/Tutorial/GacUI_Layout/Flow).
+Please check out [this tutorial project](https://github.com/vczh-libraries/Release/tree/master/Tutorial/GacUI_Layout/Flow) .
diff --git a/.github/KnowledgeBase/manual/gacui/components/compositions/home.md b/.github/KnowledgeBase/manual/gacui/components/compositions/home.md
index 90c5a8cc..b5279c66 100644
--- a/.github/KnowledgeBase/manual/gacui/components/compositions/home.md
+++ b/.github/KnowledgeBase/manual/gacui/components/compositions/home.md
@@ -1,6 +1,6 @@
# Compositions
-[Composition](../../.././gacui/kb/compositions.md)offer layout algorithms based on constraints. Usually, developers using GacUI places nested controls and compositions in a window, by defining constraints between compositions, the window knows its minimum size, and how to change sizes of child controls when the window is resizing.
+[Composition](../../.././gacui/kb/compositions.md) offer layout algorithms based on constraints. Usually, developers using GacUI places nested controls and compositions in a window, by defining constraints between compositions, the window knows its minimum size, and how to change sizes of child controls when the window is resizing.
There are a lot of predefined compositions as follows, each defines a kind of constraint:
- GuiGraphicsComposition
@@ -38,11 +38,11 @@ Here we introduce common constraints and configuration of all compositions first
## TransparentToMouse property
-The default value is**false**.
+The default value is **false**.
-If it is set to**true**, this composition becomes transparent to the mouse. When a mouse clicks on this composition, the click just go through this composition and hit a non-transparent one under this composition.
+If it is set to **true**, this composition becomes transparent to the mouse. When a mouse clicks on this composition, the click just go through this composition and hit a non-transparent one under this composition.
-**Note**: by setting it to**true**, it doesn't makes child compositions become transparent to the mouse. If you want a whole composition tree to be transparent to the mouse, every single composition in this tree must have this property set to**true**.
+**Note**: by setting it to **true**, it doesn't makes child compositions become transparent to the mouse. If you want a whole composition tree to be transparent to the mouse, every single composition in this tree must have this property set to **true**.
## AssociatedCursor property
@@ -50,27 +50,27 @@ This property defines how the cursor should look like when the cursor is over th
If this property is not set, it will ask its parent composition for a value.
-In**GacUI XML Resource**, the type of this property is**presentation::INativeCursor::SystemCursorType**. The value could be any item of this enum.
+In **GacUI XML Resource**, the type of this property is **presentation::INativeCursor::SystemCursorType**. The value could be any item of this enum.
## AssociatedHitTestResult property
The property defines how the window should behave when the mouse is interacting with this composition.
-The type of this property is**presentation::INativeWindowListener::HitTestResult**. The value could be any item of this enum.
+The type of this property is **presentation::INativeWindowListener::HitTestResult**. The value could be any item of this enum.
-Usually this property is used when implementing a control template for**\**. For example, the window template will have a close button and**ButtonClose**is set to the**AssociatedHitTestResult**property of this button's**BoundsComposition**. When the mouse clicks this button, the OS will know that this button is for closing the window, and then raise a sequence of events and close the window if it is not interrupted. No code is needed for the**Clicked**event of this button.
+Usually this property is used when implementing a control template for **\**. For example, the window template will have a close button and **ButtonClose** is set to the **AssociatedHitTestResult** property of this button's **BoundsComposition**. When the mouse clicks this button, the OS will know that this button is for closing the window, and then raise a sequence of events and close the window if it is not interrupted. No code is needed for the **Clicked** event of this button.
## Visible property
-The default value is**true**.
+The default value is **true**.
-If it is set to**false**, anything inside this composition will not be rendered,**but they still affect the sizing**as they are visible.
+If it is set to **false**, anything inside this composition will not be rendered, **but they still affect the sizing** as they are visible.
## Box Model

-**DO NOT**control layout by code,**DO**control layout by assigning proper values to properties mentioned below. the layout will be fixed as soon as possible after properties of elements are changed, and it is fast enough, but the timing is not guaranteed.
+**DO NOT** control layout by code, **DO** control layout by assigning proper values to properties mentioned below. the layout will be fixed as soon as possible after properties of elements are changed, and it is fast enough, but the timing is not guaranteed.
Any attempts to read the position of size of composition by programming could lead to unexpected result.
@@ -78,37 +78,37 @@ Any attempts to read the position of size of composition by programming could le
The minimum size is controlled by the following properties:
- **PreferredMinSize**
-- **OwnedElement**when**MinSizeLimitation**is**LimitToElement**or**LimitToElementAndChildren**
-- **Children**when**MinSizeLimitation**is**LimitToElementAndChildren**And also by the following properties that only exist in**GuiBoundsComposition**and its derived classes:
+- **OwnedElement** when **MinSizeLimitation** is **LimitToElement** or **LimitToElementAndChildren**
+- **Children** when **MinSizeLimitation** is **LimitToElementAndChildren** And also by the following properties that only exist in **GuiBoundsComposition** and its derived classes:
- **ExpectedBounds**'s size
-- Children's**AlignmentToParent**when**MinSizeLimitation**is**LimitToElementAndChildren**
+- Children's **AlignmentToParent** when **MinSizeLimitation** is **LimitToElementAndChildren**
A composition has a default minimum size to 0.
-By assigning an element to the**OwnedElement**property, the element is binded to this composition. The element is rendered using the composition's position and size.
+By assigning an element to the **OwnedElement** property, the element is binded to this composition. The element is rendered using the composition's position and size.
-Sometimes the element requires a minimum size to render its full content (typically for**SolidLabel**without enabling trailing ellipses). To assign the minimum size to this composition, simply just set**MinSizeLimitation**to**LimitToElement**or**LimitToElementAndChildren**.
+Sometimes the element requires a minimum size to render its full content (typically for **SolidLabel** without enabling trailing ellipses). To assign the minimum size to this composition, simply just set **MinSizeLimitation** to **LimitToElement** or **LimitToElementAndChildren**.
-If this composition has children, there will also be a minimum size to render all children. To assign the minimum size to this composition, simply just set**MinSizeLimitation**to**LimitToElementAndChildren**.
+If this composition has children, there will also be a minimum size to render all children. To assign the minimum size to this composition, simply just set **MinSizeLimitation** to **LimitToElementAndChildren**.
-You can also assign a minimum size to this composition using the**PreferredMinSize**property.
+You can also assign a minimum size to this composition using the **PreferredMinSize** property.
### Position of the composition
The position is controlled by the following properties:
-- **AlignmentToParent**, defaults to (-1,-1,-1,-1). Any component of**AlignmentToParent**must be -1 or non-negative.**AlignmentToParent**is the gap between this composition and its parent compositon.
+- **AlignmentToParent**, defaults to (-1,-1,-1,-1). Any component of **AlignmentToParent** must be -1 or non-negative. **AlignmentToParent** is the gap between this composition and its parent compositon.
- **ExpectedBounds**, defaults to (0,0,0,0).
-- **InternalMargin**of the parent composition, defaults to (0,0,0,0). Any component of**InternalMargin**must be non-negative.**InternalMargin**adds a gap between this component and its children compositions. A component of**InternalMargin**is considered when the corresponding component of**AlignmentToParent**of a child composition is**-1**.
+- **InternalMargin** of the parent composition, defaults to (0,0,0,0). Any component of **InternalMargin** must be non-negative. **InternalMargin** adds a gap between this component and its children compositions. A component of **InternalMargin** is considered when the corresponding component of **AlignmentToParent** of a child composition is **-1**.
-Considering**left**and**right**of**AlignmentToParent**.
-- If both are not -1, the gap between this composition and its parent is defined by**AlignmentToParent**.
-- If**left**is -1 and**right**is not, the right gap is defined by**AlignmentToParent**, the left gap is decided by the component's width.
-- If**left**is not -1 and**right**is not, the left gap is defined by**AlignmentToParent**, the right gap is decided by the component's width.
-- If both are -1, the left gap is defined by**ExpectedBounds**combining with its parent's**InternalMargin**, the right gap is decided by the component's width.**top**,**bottom**and height are similar to what is described above.
+Considering **left** and **right** of **AlignmentToParent**.
+- If both are not -1, the gap between this composition and its parent is defined by **AlignmentToParent**.
+- If **left** is -1 and **right** is not, the right gap is defined by **AlignmentToParent**, the left gap is decided by the component's width.
+- If **left** is not -1 and **right** is not, the left gap is defined by **AlignmentToParent**, the right gap is decided by the component's width.
+- If both are -1, the left gap is defined by **ExpectedBounds** combining with its parent's **InternalMargin**, the right gap is decided by the component's width.**top**, **bottom** and height are similar to what is described above.
-**AlignmentToParent**also affects the minimum size of the parent composition if**MinSizeLimitation**of the parent composition is set to**LimitToElementAndChildren**.
+**AlignmentToParent** also affects the minimum size of the parent composition if **MinSizeLimitation** of the parent composition is set to **LimitToElementAndChildren**.
-**NOTE**: some compositions like**\**or**\**ignores**AlignmentToParent**.
+**NOTE**: some compositions like **\** or **\** ignores **AlignmentToParent**.
### Keeping a button at the right-bottom corner of the window
@@ -119,50 +119,49 @@ This is very straightforward:
```
-
By doing this, the button will keep its right 5 pixel (96 dpi) away from its parent's right, also its bottom 5 pixel (96 dpi) away from its parent's bottom. When the size of its parent changes, the button will stick to the right-bottom corner.
-**NOTE**: you are recommended to use**\**when you can, since the size of the button could change because it has different text under different OS language configuration.**\**helps to organize the button and the content above the button, or when there are multiple button on the right-bottom size.
+**NOTE**: you are recommended to use **\** when you can, since the size of the button could change because it has different text under different OS language configuration. **\** helps to organize the button and the content above the button, or when there are multiple button on the right-bottom size.
## Data Binding on Positioning Properties
-Just**DON'T DO THIS**.
+Just **DON'T DO THIS**.
-**IT IS DANGEROUS**to bind one positining properties to another. For example, you may want to keep a composition takes exactly the left half of its parent composition. But if you bind**AlignmentToParent**of this composition to its size, it could results in keeping growing its parent composition.
+**IT IS DANGEROUS** to bind one positining properties to another. For example, you may want to keep a composition takes exactly the left half of its parent composition. But if you bind **AlignmentToParent** of this composition to its size, it could results in keeping growing its parent composition.
-When the parent composition grows (e.g. dragging the window), the child composition also grows because it wants to keep the gap exactly to**AlignmentToParent**. After that**AlignmentToParent**also grows because the child composition grows, and it makes the parent composition to grow again because the gap increases. This process never stops, the window will keep growing when it is resizing, until forever.
+When the parent composition grows (e.g. dragging the window), the child composition also grows because it wants to keep the gap exactly to **AlignmentToParent**. After that **AlignmentToParent** also grows because the child composition grows, and it makes the parent composition to grow again because the gap increases. This process never stops, the window will keep growing when it is resizing, until forever.
## Other Properties
### AssociatedControl
-This property returns the control, whose**BoundsComposition**is this composition.
+This property returns the control, whose **BoundsComposition** is this composition.
-This property could return**null**when this composition is not a**BoundsComposition**of a control.
+This property could return **null** when this composition is not a **BoundsComposition** of a control.
### RelatedControl
This property returns the most inner control that contains this composition.
-This property could return**null**when this composition has not been put in a control yet.
+This property could return **null** when this composition has not been put in a control yet.
### RelatedControlHost
This property returns the window that contains this composition.
-This property could return**null**when this composition has not been put in a control yet. Or the control has not been put in a window yet.
+This property could return **null** when this composition has not been put in a control yet. Or the control has not been put in a window yet.
## The timing of layout calculation
GacUI will trigger layout calculation automatically, once on each frame until calculation becomes table, and it stops.
-It can also be triggered by calling the**ForceCalculateSizeImmediately**method on a composition you want to process. It calculates the layout of the composition and all its direct and indirect child compositions.
+It can also be triggered by calling the **ForceCalculateSizeImmediately** method on a composition you want to process. It calculates the layout of the composition and all its direct and indirect child compositions.
Only when the calculation is completed, the following properties of a composition are updated:
-- **CachedMinSize**, triggering the**CachedMinSizeChanged**property.
-- **CachedMinClientSize**, triggering the**CachedMinSizeChanged**property.
-- **CachedBounds**, triggering the**CachedBoundsChanged**property.
-- **CachedClientArea**, triggering the**CachedBoundsChanged**property.
+- **CachedMinSize**, triggering the **CachedMinSizeChanged** property.
+- **CachedMinClientSize**, triggering the **CachedMinSizeChanged** property.
+- **CachedBounds**, triggering the **CachedBoundsChanged** property.
+- **CachedClientArea**, triggering the **CachedBoundsChanged** property.
### ForceCalculateSizeImmediately Method
@@ -174,7 +173,7 @@ The minimum size of a composition.
### CachedMinClientSize property
-The minimum client size of a composition, which is**CachedMinSize**but the area of**InternalMargin**is excluded.
+The minimum client size of a composition, which is **CachedMinSize** but the area of **InternalMargin** is excluded.
### CachedBounds property
@@ -182,5 +181,5 @@ The position and actual size of a composition in its parent's coordinate space.
### CachedClientArea property
-The position and actual size of a composition's client area in its parent's coordinate space, which is**CachedBounds**but the area of**InternalMargin**is excluded.
+The position and actual size of a composition's client area in its parent's coordinate space, which is **CachedBounds** but the area of **InternalMargin** is excluded.
diff --git a/.github/KnowledgeBase/manual/gacui/components/compositions/partialview.md b/.github/KnowledgeBase/manual/gacui/components/compositions/partialview.md
index 8aa356ef..e119bf54 100644
--- a/.github/KnowledgeBase/manual/gacui/components/compositions/partialview.md
+++ b/.github/KnowledgeBase/manual/gacui/components/compositions/partialview.md
@@ -1,44 +1,42 @@
# \
-**\**sticks its location and size to a ratio of the location and size of its parent composition.
+**\** sticks its location and size to a ratio of the location and size of its parent composition.
-**\**is not a**\**, there is no writable**ExpectedBounds**and**AlignmentToParent**in this composition.
+**\** is not a **\**, there is no writable **ExpectedBounds** and **AlignmentToParent** in this composition.
-**Margin**of this composition and**InternalMargin**of its parent composition are ignored.
+**Margin** of this composition and **InternalMargin** of its parent composition are ignored.
-One of the scenario for**\**is the moving handle of a scroll bar.
+One of the scenario for **\** is the moving handle of a scroll bar.
## \::WidthRatio and \::WidthPageSize
-The default value of**WidthRatio**is**0.0**.
+The default value of **WidthRatio** is **0.0**.
-The default value of**WidthPageSize**is**1.0**.
+The default value of **WidthPageSize** is **1.0**.
-
-- Value for**WidthRatio**should be in**[0, 1]**
-- Value for**WidthPageSize**should be in**[0, 1]**
-- **WidthRatio**+**WidthPageSize**should not exceed 1
+- Value for **WidthRatio** should be in **[0, 1]**
+- Value for **WidthPageSize** should be in **[0, 1]**
+- **WidthRatio** + **WidthPageSize** should not exceed 1
These properties define the location and size of this composition in the following way:
-- The distance between this composition to the left border of its parent composition is**WidthRatio*** "width of its parent composition".
-- The width of this composition is**WidthPageSize*** "width of its parent composition".
+- The distance between this composition to the left border of its parent composition is **WidthRatio** * "width of its parent composition".
+- The width of this composition is **WidthPageSize** * "width of its parent composition".
## \::HeightRatio and \::HeightPageSize
-The default value of**HeightRatio**is**0.0**.
+The default value of **HeightRatio** is **0.0**.
-The default value of**HeightPageSize**is**1.0**.
+The default value of **HeightPageSize** is **1.0**.
-
-- Value for**HeightRatio**should be in**[0, 1]**
-- Value for**HeightPageSize**should be in**[0, 1]**
-- **HeightRatio**+**HeightPageSize**should not exceed 1
+- Value for **HeightRatio** should be in **[0, 1]**
+- Value for **HeightPageSize** should be in **[0, 1]**
+- **HeightRatio** + **HeightPageSize** should not exceed 1
These properties define the location and size of this composition in the following way:
-- The distance between this composition to the left border of its parent composition is**HeightRatio*** "height of its parent composition".
-- The height of this composition is**HeightPageSize*** "height of its parent composition".
+- The distance between this composition to the left border of its parent composition is **HeightRatio** * "height of its parent composition".
+- The height of this composition is **HeightPageSize** * "height of its parent composition".
## Sample
-Please check out[dark skin control templates](https://github.com/vczh-libraries/GacUI/blob/master/Source/Skins/DarkSkin/Template_Scroll.xml).
+Please check out [dark skin control templates](https://github.com/vczh-libraries/GacUI/blob/master/Source/Skins/DarkSkin/Template_Scroll.xml) .
diff --git a/.github/KnowledgeBase/manual/gacui/components/compositions/repeat.md b/.github/KnowledgeBase/manual/gacui/components/compositions/repeat.md
index 65d11346..2295e5a0 100644
--- a/.github/KnowledgeBase/manual/gacui/components/compositions/repeat.md
+++ b/.github/KnowledgeBase/manual/gacui/components/compositions/repeat.md
@@ -1,6 +1,6 @@
# Repeat Compositions
-**GuiRepeatCompositionBase**is the base class of all repeat compositions, which takes an item template and an item source, displays items in the item source using the item template, and maintain the order automatically when items in the item source are add/remove/change.
+**GuiRepeatCompositionBase** is the base class of all repeat compositions, which takes an item template and an item source, displays items in the item source using the item template, and maintain the order automatically when items in the item source are add/remove/change.
There are two kinds of repeat compositions:
- **GuiNonVirtialRepeatCompositionBase**: Create and maintain instances of item template for all items.
@@ -14,50 +14,50 @@ There are two kinds of repeat compositions:
## ItemSource property
-A valid object to assign to the**ItemSource**should be a**system::Enumerable^**. Here are built-in interfaces that inherits from**system::Enumerable**:
+A valid object to assign to the **ItemSource** should be a **system::Enumerable^**. Here are built-in interfaces that inherits from **system::Enumerable**:
- system::ReadonlyList
- system::List
- system::ObservableList
-Inthis page`missing document: /home/registered/vlppreflection.html`you could find C++ class names for these interfaces.
+In this page`missing document: /home/registered/vlppreflection.html` you could find C++ class names for these interfaces.
-In[this page](../../.././workflow/lang/type.md)you could find**Workflow**syntax for these types.
+In [this page](../../.././workflow/lang/type.md) you could find **Workflow** syntax for these types.
-Values in the collection must match**\**of the[instance](../../.././gacui/xmlres/tag_instance.md)that is specified in the**ItemTemplate**property.
+Values in the collection must match **\** of the [instance](../../.././gacui/xmlres/tag_instance.md) that is specified in the **ItemTemplate** property.
-If there are[multiple instances](../../.././gacui/xmlres/instance/properties.md)in the**ItemTemplate**property, the first one whose**\**is able to accept the value will be selected for the item in the collection. If none of them can, an exception will raise.
+If there are [multiple instances](../../.././gacui/xmlres/instance/properties.md) in the **ItemTemplate** property, the first one whose **\** is able to accept the value will be selected for the item in the collection. If none of them can, an exception will raise.
-To create a**system::Enumerable^**in C++, either call**vl::reflection::description::IValueEnumerable::Create**, or call**vl::reflection::description::BoxParameter**on an**vl::collections::IEnumerable\&**.
+To create a **system::Enumerable^** in C++, either call **vl::reflection::description::IValueEnumerable::Create**, or call **vl::reflection::description::BoxParameter** on an **vl::collections::IEnumerable\&**.
-To create a**system::List^**in C++, either call**vl::reflection::description::IValueList::Create**, or call**vl::reflection::description::BoxParameter**on an**vl::collections::IList\&**.
+To create a **system::List^** in C++, either call **vl::reflection::description::IValueList::Create**, or call **vl::reflection::description::BoxParameter** on an **vl::collections::IList\&**.
-The**BoxParameter**function creates a reference to the C++ collection, the C++ collection and the created object share items in the collection, and one can observe changes from another.
+The **BoxParameter** function creates a reference to the C++ collection, the C++ collection and the created object share items in the collection, and one can observe changes from another.
## Binding system::ObservableList to ItemSource property
-If an**ObservableList**is assigned to the**ItemSource**property, when items in the list changed, associated instance of item templates will be automatically created or destroyed.
+If an **ObservableList** is assigned to the **ItemSource** property, when items in the list changed, associated instance of item templates will be automatically created or destroyed.
-To create a**system::ObservableList^**in C++, either call**vl::reflection::description::IValueObservableList::Create**, or use**vl::collections::ObservableList\**as your collection class and call the**BoxParameter**function on it.
+To create a **system::ObservableList^** in C++, either call **vl::reflection::description::IValueObservableList::Create**, or use **vl::collections::ObservableList\** as your collection class and call the **BoxParameter** function on it.
-The**BoxParameter**function creates a reference to the C++ collection, the C++ collection and the created object share items in the collection, and one can observe changes from another.
+The **BoxParameter** function creates a reference to the C++ collection, the C++ collection and the created object share items in the collection, and one can observe changes from another.
## ItemTemplate property
-The[ItemTemplate](../../.././gacui/xmlres/instance/properties.md)property accepts one or a list of[instances](../../.././gacui/xmlres/tag_instance.md)in their full names or XML names.
+The [ItemTemplate](../../.././gacui/xmlres/instance/properties.md) property accepts one or a list of [instances](../../.././gacui/xmlres/tag_instance.md) in their full names or XML names.
-Instances here are required to have exactly one**\**as the only argument in their constructor.
+Instances here are required to have exactly one **\** as the only argument in their constructor.
-When**ItemSource**is being assigned, or when**ItemSource**is a**system::ObservableList^**and new items are inserted to the list, instances in**ItemTemplate**will be tested one by one to see if its constructor argument could accept the item in the list.
+When **ItemSource** is being assigned, or when **ItemSource** is a **system::ObservableList^** and new items are inserted to the list, instances in **ItemTemplate** will be tested one by one to see if its constructor argument could accept the item in the list.
-The first instance of a successful test will be created with the item in the list, with**MinSizeLimitation**set to**LimitToElementAndChildren**and**Margin**set to**left:0 top:0 right:0 bottom:0**.
+The first instance of a successful test will be created with the item in the list, with **MinSizeLimitation** set to **LimitToElementAndChildren** and **Margin** set to **left:0 top:0 right:0 bottom:0**.
## Context property
-**Context**property of any living**ItemTemplate**instance will always sync to**Context**property of the repeat composition.
+**Context** property of any living **ItemTemplate** instance will always sync to **Context** property of the repeat composition.
-**\**and**\**are**\**and**\**with data binding.
+**\** and **\** are **\** and **\** with data binding.
## Sample
-Please check out[the demo for and ](https://github.com/vczh-libraries/Release/blob/master/Tutorial/GacUI_ControlTemplate/BlackSkin/UI/FullControlTest/RepeatTabPage.xml)and its[sample item templates](https://github.com/vczh-libraries/Release/blob/master/Tutorial/GacUI_ControlTemplate/BlackSkin/UI/FullControlTest/RepeatComponents.xml).
+Please check out [the demo for and ](https://github.com/vczh-libraries/Release/blob/master/Tutorial/GacUI_ControlTemplate/BlackSkin/UI/FullControlTest/RepeatTabPage.xml) and its [sample item templates](https://github.com/vczh-libraries/Release/blob/master/Tutorial/GacUI_ControlTemplate/BlackSkin/UI/FullControlTest/RepeatComponents.xml) .
diff --git a/.github/KnowledgeBase/manual/gacui/components/compositions/repeat_nonvirtual.md b/.github/KnowledgeBase/manual/gacui/components/compositions/repeat_nonvirtual.md
index b20f9771..712a2eae 100644
--- a/.github/KnowledgeBase/manual/gacui/components/compositions/repeat_nonvirtual.md
+++ b/.github/KnowledgeBase/manual/gacui/components/compositions/repeat_nonvirtual.md
@@ -1,22 +1,22 @@
# \ and \
-**\**and**\**are**\**and**\**with data binding.
+**\** and **\** are **\** and **\** with data binding.
-You are not required to create**\**or**\**for each item. Instead, you bind a collection object to the**ItemSource**property, assign an item template to the**ItemTemplate**property,**\**or**\**will create**\**or**\**for each item in**ItemSource**, each containing an instance from**ItemTemplate**to display an item in**ItemSource**.
+You are not required to create **\** or **\** for each item. Instead, you bind a collection object to the **ItemSource** property, assign an item template to the **ItemTemplate** property, **\** or **\** will create **\** or **\** for each item in **ItemSource**, each containing an instance from **ItemTemplate** to display an item in **ItemSource**.
-**\**inherits from**\**,**\**inherits from**\**, all properties in**\**or**\**are available.
+**\** inherits from **\**, **\** inherits from **\**, all properties in **\** or **\** are available.
## Accessing auto-managed \ or \
-**\::StackItems**property or**\