| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Enhanced Platform-specific UI Layout Definition v1.4 -->
- <ui-layout-def xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="ui-layout-definition"
- xsi:schemaLocation="ui-layout-definition ui-layout-def.xsd"
- version="1.4"
- schema-version="1.4"
- min-version="1.0"
- max-version="2.0"
- target-platform="avalonia"
- accessibility-compliance="wcag-aa">
-
- <!-- Enhanced validation rules with custom validators -->
- <validation-rules>
- <validation-include src="wcag-validation.xml" important="true" min-version="1.3" />
- <validation-include src="avalonia-validation.xml" important="true" platform="avalonia" />
- <validation-include src="performance-validation.xml" important="false" min-version="1.3" />
-
- <custom-validator name="PlatformCompatibilityValidator" version="1.0" category="compatibility">
- <description>Validates platform-specific control usage</description>
- <implementation>
- <script language="javascript">
- function validate(element, context) {
- const platform = context.targetPlatform;
- const controlPlatform = element.getAttribute('platform-hint') || 'basic';
- return platform === controlPlatform || controlPlatform === 'basic';
- }
- </script>
- </implementation>
- </custom-validator>
-
- <validation-profile name="AvaloniaProductionProfile" target-platform="avalonia" enabled="true">
- <description>Production validation profile for Avalonia applications</description>
- <profile-rule rule-name="PlatformCompatibilityValidator" enabled="true" severity="warning" />
- <profile-rule rule-name="accessibility-compliance" enabled="true" severity="error" />
- <configuration parallel-execution="true" cache-results="true">
- <setting key="min-avalonia-version" value="11.0" scope="profile" />
- </configuration>
- </validation-profile>
- </validation-rules>
-
- <!-- Platform-specific patterns with version constraints -->
- <patterns>
- <!-- Core Avalonia controls -->
- <pattern-include src="avalonia-controls.xml" important="true" platform="avalonia" min-version="1.3" />
- <!-- Enhanced accessibility controls -->
- <pattern-include src="accessibility-controls.xml" important="true" min-version="1.3" />
- <!-- Performance-optimized controls -->
- <pattern-include src="performance-controls.xml" important="false" min-version="1.3" />
-
- <!-- Platform-specific enhanced control -->
- <control name="AvaloniaEnhancedDataGrid" type="data" category="avalonia-data" schema-version="1.4">
- <description>Avalonia-specific data grid with advanced features</description>
- <constraints>
- <allowed-parents>Panel,Grid,ScrollViewer</allowed-parents>
- <allowed-children>columns</allowed-children>
- <container>true</container>
- <platform-constraints>
- <platform-constraint platform="avalonia" min-version="11.0"
- feature-required="data-virtualization" />
- </platform-constraints>
- <performance-hints virtualization-supported="true" heavy-rendering="false"
- recommended-max-items="50000" />
- </constraints>
- <attributes>
- <attribute name="items-source" type="binding" category="data"
- description="Collection binding for data source" />
- <attribute name="virtualization-mode" type="enum"
- values="None,Standard,Recycling" default="Recycling"
- category="performance" platform-specific="avalonia" />
- <attribute name="theme-variant" type="enum"
- values="Default,Light,Dark,HighContrast" default="Default"
- category="appearance" platform-specific="avalonia" />
- </attributes>
- <data-binding supports-two-way="true" supports-commands="true" supports-validation="true">
- <bindable-property name="ItemsSource" type="collection" mode="OneWay"
- dependency-property="true" />
- <bindable-property name="SelectedItems" type="collection" mode="TwoWay"
- dependency-property="true" />
- <bindable-property name="CurrentItem" type="object" mode="TwoWay" />
- </data-binding>
- <behavior>
- <event name="selection-changed" async="false" accessibility-event="true" />
- <event name="cell-edit-ending" async="false" cancelable="true" />
- <command name="ExportCommand" can-execute-property="HasData" async="true" />
- <gesture name="double-tap-edit" type="double-tap" platform-specific="avalonia" />
- </behavior>
- </control>
- </patterns>
-
- <!-- Enhanced business views -->
- <views>
- <view-include src="business-views.xml" important="true" min-version="1.2" />
-
- <!-- Platform-optimized view -->
- <view name="AvaloniaProductManagementView" type="business-entity" category="core"
- schema-version="1.4" platform="avalonia" singleton="false" lazy-loading="true"
- cacheable="true" priority="high">
- <description>Product management optimized for Avalonia UI</description>
-
- <metadata>
- <model-class>Product</model-class>
- <view-model-class>AvaloniaProductViewModel</view-model-class>
- <permissions>product.read,product.write</permissions>
- <author>Platform Team</author>
- <version>2.1.0</version>
- <documentation-url>https://docs.company.com/avalonia-product-view</documentation-url>
- <tags>
- <tag>avalonia-optimized</tag>
- <tag>high-performance</tag>
- <tag>accessible</tag>
- </tags>
- </metadata>
-
- <!-- Avalonia-specific state management -->
- <state-management pattern="redux" persistence="local">
- <state name="initializing" initial="true" data-snapshot="InitState" />
- <state name="loaded" final="false" data-snapshot="LoadedState" />
- <state name="editing" final="false" data-snapshot="EditState" />
- <state name="saving" final="false" data-snapshot="SavingState" />
- <transition from="initializing" to="loaded" trigger="data-loaded"
- condition="products.length > 0" action="displayProducts" />
- <transition from="loaded" to="editing" trigger="edit-requested" action="startEdit" />
- <transition from="editing" to="saving" trigger="save-requested"
- condition="validation.isValid" action="saveProduct" />
- <transition from="saving" to="loaded" trigger="save-completed" action="refreshView" />
- </state-management>
-
- <!-- Enhanced accessibility for Avalonia -->
- <accessibility level="aa" tested="true">
- <compliance standard="wcag" level="aa" verified="true" />
- <feature name="screen-reader" type="screen-reader" required="true"
- implementation="Avalonia accessibility tree integration" />
- <feature name="keyboard-navigation" type="keyboard-navigation" required="true"
- implementation="Full tab navigation with focus indicators" />
- <feature name="high-contrast" type="high-contrast" required="true"
- implementation="Avalonia theme system integration" />
- </accessibility>
-
- <!-- Performance optimization for large datasets -->
- <performance target-load-time="800" memory-limit="200MB">
- <metric name="grid-render-time" type="load-time" target="300ms" critical="true" />
- <metric name="scroll-performance" type="frame-rate" target="60fps" critical="true" />
- <optimization technique="virtualization" description="UI virtualization for product grid" impact="high" />
- <optimization technique="lazy-loading" description="Load product details on demand" impact="medium" />
- <optimization technique="caching" description="Cache frequently accessed products" impact="medium" />
- </performance>
-
- <!-- Enhanced security -->
- <security level="high" audit-required="true">
- <permission name="product-read" type="read" required="true" scope="view" />
- <permission name="product-write" type="write" required="false" scope="data" />
- <vulnerability-protection type="injection" protection="parameterized-queries" severity="critical" />
- <data-protection encryption="true" gdpr-compliant="true" />
- </security>
-
- <!-- Comprehensive localization -->
- <localization default-culture="en-US" rtl-support="true">
- <supported-culture code="de-DE" name="German" completion="100" verified="true" />
- <supported-culture code="fr-FR" name="French" completion="95" verified="true" />
- <supported-culture code="ar-SA" name="Arabic" completion="80" verified="false" />
- <resource-bundle name="ProductResources" path="Resources/Products" type="resx" />
- </localization>
-
- <!-- Avalonia-specific testing -->
- <testing coverage-target="90" strategy="integration">
- <test-scenario name="product-crud" type="functional" priority="high" automated="true">
- <step action="load-products" expected="grid-populated" />
- <step action="create-product" expected="edit-dialog-shown" />
- <step action="save-product" expected="product-saved" />
- </test-scenario>
- <test-scenario name="accessibility-compliance" type="accessibility" priority="high" automated="true">
- <step action="keyboard-navigation" expected="all-controls-accessible" />
- <step action="screen-reader-test" expected="proper-announcements" />
- </test-scenario>
- <automation framework="avalonia-test-framework" selector-strategy="accessibility" />
- </testing>
-
- <dependencies>
- <service-ref name="ProductService" interface="IProductService" scope="scoped" required="true" />
- <library-ref name="Avalonia.Controls.DataGrid" version="11.0.0" source="nuget" optional="false" />
- </dependencies>
-
- <data-context>
- <property name="products" type="ObservableCollection<Product>" scope="view"
- observable="true" validation="NotNull" />
- <property name="selectedProduct" type="Product" scope="view" nullable="true" observable="true" />
- <property name="isLoading" type="bool" scope="view" default-value="false" observable="true" />
- <property name="filterText" type="string" scope="view" default-value="" observable="true" />
- </data-context>
-
- <windows>
- <window-ref name="ProductListWindow" role="main" default="true" lazy-load="false"
- priority="critical" />
- <window-ref name="ProductEditDialog" role="editor" default="false" lazy-load="true"
- priority="normal" />
- </windows>
-
- <communication>
- <publishes>
- <event name="product-selected" data="product-id" async="false" />
- <event name="products-filtered" data="filter-criteria" async="true" />
- </publishes>
- <subscribes>
- <event name="product-updated" source="ProductService" handler="refresh-product"
- async="true" debounce="1000" />
- </subscribes>
- <real-time>
- <connection name="product-updates" protocol="signalr" endpoint="/productHub"
- auto-reconnect="true" />
- </real-time>
- </communication>
- </view>
- </views>
-
- <!-- Platform-specific window includes -->
- <window-includes>
- <window-include src="avalonia-windows.xml" important="true" platform="avalonia" min-version="1.3" />
- <window-include src="responsive-windows.xml" important="false" min-version="1.3" />
- </window-includes>
-
- <!-- Enhanced main window with Avalonia-specific features -->
- <window name="ProductListWindow" title="Product Management - Avalonia"
- view="AvaloniaProductManagementView" target-platform="avalonia" schema-version="1.4">
-
- <attributes>
- <attribute name="width" value="1200" />
- <attribute name="height" value="800" />
- <attribute name="min-width" value="800" />
- <attribute name="min-height" value="600" />
- <attribute name="window-state" value="Normal" />
- <attribute name="can-resize" value="true" />
- <attribute name="system-decorations" value="Full" />
- <attribute name="extend-client-area-to-decorations-hint" value="false" />
- </attributes>
-
- <view-properties>
- <role>main</role>
- <default>true</default>
- <data-context-binding>products</data-context-binding>
- </view-properties>
-
- <!-- Enhanced data binding for Avalonia -->
- <data-binding>
- <data-context source="AvaloniaProductViewModel" type="ViewModels.AvaloniaProductViewModel" mode="TwoWay" />
- <view-model class="AvaloniaProductViewModel" assembly="ProductManagement.Avalonia"
- namespace="ProductManagement.ViewModels" />
- <binding-properties>
- <property control="productGrid" property="ItemsSource" binding-path="Products"
- mode="OneWay" validation-rule="NotNullValidator" />
- <property control="searchBox" property="Text" binding-path="FilterText"
- mode="TwoWay" converter="StringTrimConverter" />
- <property control="loadingIndicator" property="IsVisible" binding-path="IsLoading"
- mode="OneWay" converter="BooleanToVisibilityConverter" />
- </binding-properties>
- </data-binding>
-
- <!-- Avalonia-specific accessibility -->
- <accessibility compliance-level="wcag-aa">
- <screen-reader window-title="Product Management Application"
- description="Manage products with full accessibility support"
- landmark-role="main" />
- <keyboard-navigation tab-order-start="1" focus-trap="false" escape-closes="false" />
- <color-contrast high-contrast-support="true" minimum-ratio="4.5" />
- </accessibility>
-
- <!-- Main layout with Avalonia controls -->
- <DockPanel name="mainContainer">
- <!-- Header with Avalonia-specific controls -->
- <Border name="headerBorder" dock-panel-dock="Top" background="LightGray" padding="10">
- <Grid name="headerGrid">
- <grid-definitions>
- <column-definitions>
- <column-definition width="*" />
- <column-definition width="Auto" />
- <column-definition width="Auto" />
- </column-definitions>
- </grid-definitions>
-
- <TextBlock name="titleText" grid-column="0" text="Product Management"
- font-size="18" font-weight="Bold" vertical-alignment="Center"
- aria-label="Application title" />
-
- <ProgressBar name="loadingIndicator" grid-column="1" width="100" height="4"
- is-indeterminate="true" is-visible="{Binding IsLoading}"
- margin="10,0" vertical-alignment="Center"
- aria-label="Loading progress" />
-
- <StackPanel name="actionButtons" grid-column="2" orientation="horizontal" spacing="5">
- <Button name="addButton" content="Add Product"
- command="{Binding AddProductCommand}"
- aria-label="Add new product" />
- <Button name="refreshButton" content="Refresh"
- command="{Binding RefreshCommand}"
- aria-label="Refresh product list" />
- <Button name="settingsButton" content="Settings"
- command="{Binding ShowSettingsCommand}"
- aria-label="Open application settings" />
- </StackPanel>
- </Grid>
- </Border>
-
- <!-- Search and filter panel -->
- <Border name="filterBorder" dock-panel-dock="Top" background="WhiteSmoke" padding="10">
- <Grid name="filterGrid">
- <grid-definitions>
- <column-definitions>
- <column-definition width="Auto" />
- <column-definition width="*" />
- <column-definition width="Auto" />
- <column-definition width="Auto" />
- </column-definitions>
- </grid-definitions>
-
- <TextBlock name="searchLabel" grid-column="0" text="Search:"
- vertical-alignment="Center" margin="0,0,10,0"
- aria-label="Search products" />
-
- <AutoCompleteBox name="searchBox" grid-column="1"
- placeholder-text="Search products by name, SKU, or category..."
- text="{Binding FilterText, Mode=TwoWay}"
- items-source="{Binding SearchSuggestions}"
- minimum-prefix-length="2" filter-mode="Contains"
- aria-label="Product search field"
- aria-description="Enter text to search and filter products" />
-
- <ComboBox name="categoryFilter" grid-column="2"
- placeholder-text="All Categories"
- items-source="{Binding Categories}"
- selected-item="{Binding SelectedCategory, Mode=TwoWay}"
- display-member-path="Name" margin="10,0,0,0"
- aria-label="Filter by category" />
-
- <Button name="clearFiltersButton" grid-column="3" content="Clear"
- command="{Binding ClearFiltersCommand}" margin="10,0,0,0"
- aria-label="Clear all filters" />
- </Grid>
- </Border>
-
- <!-- Main data grid with Avalonia-specific features -->
- <AvaloniaEnhancedDataGrid name="productGrid"
- items-source="{Binding Products}"
- selected-item="{Binding SelectedProduct, Mode=TwoWay}"
- virtualization-mode="Recycling"
- theme-variant="{Binding CurrentTheme}"
- can-user-resize-columns="true"
- can-user-sort-columns="true"
- can-user-reorder-columns="true"
- grid-lines-visibility="Horizontal"
- selection-mode="Single"
- aria-label="Products data grid"
- aria-description="List of products with sorting and filtering capabilities">
-
- <AvaloniaEnhancedDataGrid.Columns>
- <DataGridTextColumn header="SKU" binding="{Binding SKU}" width="120"
- is-read-only="true" aria-label="Product SKU" />
- <DataGridTextColumn header="Name" binding="{Binding Name}" width="200"
- is-read-only="true" aria-label="Product name" />
- <DataGridTextColumn header="Category" binding="{Binding Category.Name}" width="150"
- is-read-only="true" aria-label="Product category" />
- <DataGridTextColumn header="Price" binding="{Binding Price}" width="100"
- is-read-only="true" aria-label="Product price">
- <DataGridTextColumn.ElementStyle>
- <Style TargetType="TextBlock">
- <Setter Property="HorizontalAlignment" Value="Right" />
- <Setter Property="FontWeight" Value="Bold" />
- </Style>
- </DataGridTextColumn.ElementStyle>
- </DataGridTextColumn>
- <DataGridTextColumn header="Stock" binding="{Binding StockQuantity}" width="80"
- is-read-only="true" aria-label="Stock quantity">
- <DataGridTextColumn.ElementStyle>
- <Style TargetType="TextBlock">
- <Setter Property="HorizontalAlignment" Value="Center" />
- </Style>
- </DataGridTextColumn.ElementStyle>
- </DataGridTextColumn>
- <DataGridCheckBoxColumn header="Active" binding="{Binding IsActive}" width="60"
- is-read-only="true" aria-label="Product status" />
- <DataGridTemplateColumn header="Actions" width="150" aria-label="Product actions">
- <DataGridTemplateColumn.CellTemplate>
- <DataTemplate>
- <StackPanel orientation="horizontal" spacing="5" horizontal-alignment="Center">
- <Button content="Edit" command="{Binding $parent[Window].DataContext.EditProductCommand}"
- command-parameter="{Binding}"
- classes="compact" aria-label="Edit product" />
- <Button content="View" command="{Binding $parent[Window].DataContext.ViewProductCommand}"
- command-parameter="{Binding}"
- classes="compact" aria-label="View product details" />
- <Button content="Delete" command="{Binding $parent[Window].DataContext.DeleteProductCommand}"
- command-parameter="{Binding}"
- classes="compact danger" aria-label="Delete product" />
- </StackPanel>
- </DataTemplate>
- </DataGridTemplateColumn.CellTemplate>
- </DataGridTemplateColumn>
- </AvaloniaEnhancedDataGrid.Columns>
- </AvaloniaEnhancedDataGrid>
-
- <!-- Status bar with Avalonia styling -->
- <Border name="statusBorder" dock-panel-dock="Bottom" background="LightGray"
- border-brush="Gray" border-thickness="0,1,0,0" padding="10,5">
- <Grid name="statusGrid">
- <grid-definitions>
- <column-definitions>
- <column-definition width="*" />
- <column-definition width="Auto" />
- <column-definition width="Auto" />
- <column-definition width="Auto" />
- </column-definitions>
- </grid-definitions>
-
- <TextBlock name="statusText" grid-column="0"
- text="{Binding StatusMessage}"
- vertical-alignment="Center"
- aria-live="polite" aria-label="Status information" />
-
- <TextBlock name="recordCount" grid-column="1"
- text="{Binding Products.Count, StringFormat='Products: {0}'}"
- vertical-alignment="Center" margin="10,0"
- aria-label="Total product count" />
-
- <TextBlock name="selectedCount" grid-column="2"
- text="{Binding SelectedItems.Count, StringFormat='Selected: {0}'}"
- vertical-alignment="Center" margin="10,0"
- aria-label="Selected products count" />
-
- <TextBlock name="lastUpdated" grid-column="3"
- text="{Binding LastUpdated, StringFormat='Updated: {0:HH:mm:ss}'}"
- vertical-alignment="Center" margin="10,0"
- aria-label="Last update time" />
- </Grid>
- </Border>
- </DockPanel>
- </window>
-
- <!-- Product edit dialog with Avalonia features -->
- <window name="ProductEditDialog" title="Edit Product"
- view="AvaloniaProductManagementView" target-platform="avalonia" schema-version="1.4">
-
- <attributes>
- <attribute name="width" value="500" />
- <attribute name="height" value="600" />
- <attribute name="can-resize" value="true" />
- <attribute name="show-in-taskbar" value="false" />
- <attribute name="window-startup-location" value="CenterOwner" />
- <attribute name="system-decorations" value="Full" />
- </attributes>
-
- <view-properties>
- <role>editor</role>
- <modal>true</modal>
- <data-context-binding>selectedProduct</data-context-binding>
- <parent-window>ProductListWindow</parent-window>
- </view-properties>
-
- <accessibility compliance-level="wcag-aa">
- <screen-reader window-title="Product Edit Dialog"
- description="Form for editing product information"
- landmark-role="dialog" />
- <keyboard-navigation tab-order-start="1" focus-trap="true" escape-closes="true" />
- </accessibility>
-
- <ScrollViewer name="editFormContainer" vertical-scroll-bar-visibility="Auto">
- <StackPanel name="editFormPanel" spacing="15" margin="20">
- <TextBlock text="Product Information" font-size="16" font-weight="Bold"
- aria-label="Product information section" />
-
- <Grid name="formGrid">
- <grid-definitions>
- <column-definitions>
- <column-definition width="120" />
- <column-definition width="*" />
- </column-definitions>
- <row-definitions>
- <row-definition height="Auto" />
- <row-definition height="Auto" />
- <row-definition height="Auto" />
- <row-definition height="Auto" />
- <row-definition height="Auto" />
- <row-definition height="Auto" />
- <row-definition height="Auto" />
- </row-definitions>
- </grid-definitions>
-
- <TextBlock grid-row="0" grid-column="0" text="SKU:"
- vertical-alignment="Center" aria-label="Product SKU" />
- <TextBox name="skuTextBox" grid-row="0" grid-column="1"
- text="{Binding SKU, Mode=TwoWay}" watermark="Enter SKU..."
- aria-label="Product SKU input" />
-
- <TextBlock grid-row="1" grid-column="0" text="Name:"
- vertical-alignment="Center" margin="0,10,0,0"
- aria-label="Product name" />
- <TextBox name="nameTextBox" grid-row="1" grid-column="1" margin="0,10,0,0"
- text="{Binding Name, Mode=TwoWay}" watermark="Enter product name..."
- aria-label="Product name input" />
-
- <TextBlock grid-row="2" grid-column="0" text="Category:"
- vertical-alignment="Center" margin="0,10,0,0"
- aria-label="Product category" />
- <ComboBox name="categoryComboBox" grid-row="2" grid-column="1" margin="0,10,0,0"
- items-source="{Binding Categories}"
- selected-item="{Binding Category, Mode=TwoWay}"
- display-member-path="Name" placeholder-text="Select category..."
- aria-label="Product category selection" />
-
- <TextBlock grid-row="3" grid-column="0" text="Price:"
- vertical-alignment="Center" margin="0,10,0,0"
- aria-label="Product price" />
- <NumericUpDown name="priceUpDown" grid-row="3" grid-column="1" margin="0,10,0,0"
- value="{Binding Price, Mode=TwoWay}" minimum="0" increment="0.01"
- format-string="C2" aria-label="Product price input" />
-
- <TextBlock grid-row="4" grid-column="0" text="Stock:"
- vertical-alignment="Center" margin="0,10,0,0"
- aria-label="Stock quantity" />
- <NumericUpDown name="stockUpDown" grid-row="4" grid-column="1" margin="0,10,0,0"
- value="{Binding StockQuantity, Mode=TwoWay}" minimum="0"
- aria-label="Stock quantity input" />
-
- <TextBlock grid-row="5" grid-column="0" text="Description:"
- vertical-alignment="Top" margin="0,10,0,0"
- aria-label="Product description" />
- <TextBox name="descriptionTextBox" grid-row="5" grid-column="1" margin="0,10,0,0"
- text="{Binding Description, Mode=TwoWay}"
- accepts-return="true" text-wrapping="Wrap" height="80"
- watermark="Enter product description..."
- aria-label="Product description input" />
-
- <CheckBox name="activeCheckBox" grid-row="6" grid-column="1" margin="0,10,0,0"
- content="Active" is-checked="{Binding IsActive, Mode=TwoWay}"
- aria-label="Product active status" />
- </Grid>
-
- <!-- Dialog buttons -->
- <StackPanel name="buttonPanel" orientation="horizontal"
- horizontal-alignment="Right" spacing="10" margin="0,20,0,0">
- <Button name="saveButton" content="Save"
- command="{Binding SaveProductCommand}"
- classes="accent" aria-label="Save product changes" />
- <Button name="cancelButton" content="Cancel"
- command="{Binding CancelEditCommand}"
- aria-label="Cancel without saving" />
- <Button name="deleteButton" content="Delete"
- command="{Binding DeleteProductCommand}"
- classes="danger" aria-label="Delete this product" />
- </StackPanel>
- </StackPanel>
- </ScrollViewer>
- </window>
-
- </ui-layout-def>
|