* Tokenizer returns a ReadOnly Span instead of a string.
* Returning the old property for no API break changes
---------
Co-authored-by: Meloman19 <23280622+Meloman19@users.noreply.github.com>
* add unit tests to show that the EffectiveViewPortChanged event is not being raised when it should.
note: this tests are verified against UWP behavior.
* fix raising of EffectiveViewPortChanged event.
---------
Co-authored-by: Julien Lebosquain <julien@lebosquain.net>
Co-authored-by: Max Katz <maxkatz6@outlook.com>
* fix accelerator behavior for menu items and labels
* add elements with matching accelerator to test cycling in sub menus
* Add AccessKeyHandler tests for accelerators with more than one match
* Implement accelerator behavior based on WPF handling
* Remove commented code
* Remove OnAccessKey override => handled by DefaultMenuInteractionHandler
* remove obsolete test
* handle OnAccessKeyPressed for selected tab item
* fix unit tests
* use AccessKeyEvent instead of AccessKeyPressedEvent in unit tests
* navigate menu with and without ALT key
* Revert formatting changes in Tests
* Fix AccessKeyHandler comments
* move private types to bottom
* Remove lock statements, optimize removal of AccessKeyRegistrations
* remove call to Dispatcher.UIThread.Post
* simplifiy AccessKeyHandler.SortByHierarchy
* remove unnecessary method AccessKeyHandler.GetTargetsForSender
* regenerate API suppression file
* revert unneeded changes in MenuPage.axaml
* correct formatting changes
* do not sort by hierarchy if too few targets
* make AccessKeyEventArgs internal
* make AccessKeyPressedEventArgs internal
---------
Co-authored-by: Hans Docsek <hans.docsek@gmail.com>
* Fix InlineDictionary Behavior for Single Item Reassignment
Previous Behavior:
- When the `Set` method was called, it ignored the `overwrite` parameter if the dictionary contained only one item.
- This caused the `Set` method to behave like the `Add` method, leading to unexpected behavior in composition animations.
- Specifically, the second composition animation would not play because it could not replace the first animation. Instead, it was added after the first animation, preventing it from being executed.
Updated Behavior:
- The `InlineDictionary` now respects the `overwrite` parameter even when it contains only one item.
- This ensures that the second composition animation can overwrite the first one, allowing it to play correctly.
* Append unit test for InlineDictionary
* keep the `(TKey)_data` in a variable and reuse it below line 90 so we avoid a double cast
* Rename the test method
* Remove the unnecessary assignment code.
* removed duplicated code between Window.Show and Window.ShowDialog
* Handling different cases of window initial position and size + unit test
* positioning cursor on resize grip in WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_Clicking_Resize_Grip test
* Fix for flaky test
* displaying decimal digits of slider value to avoid some issues with rounding
---------
Co-authored-by: Herman Kirshin <herman.kirshin@jetbrains.com>
* Basic failing unit test for UWP/WinUI XYFocus search boundary scenario.
* Change IsAllowedXYNavigationMode to return false if keyDeviceType is null and modes == disabled.
* Add helper function to find the closest InputElement to the target element whose parent does not allow XYFocus rather than always searching from the TopLevel. This restricts focus searches within a specific subtree rather than allowing searches to bridge subtrees that share an XYFocus disabled parent.
* Set isDirectory:true explicitly to help [NSURL fileURLWithPath] method
Might solve some rare/random issues with initial directory not being applied
* Fix dialogs page incorrectly setting parent folder
* Move SecurityScopedStream out of iOS project and share it with macOS project
* Refactor BclStorageItem to be more reusable across platforms
* [Breaking] Set BclStorageItem.CanBookmark to false, as it never was supposed to be true. Plain BCL doesn't provide files bookmarking.
* Reimplement storage provider support on macOS, support (optional) sandboxing
* Fix build
* Fix AppSandboxEnabled=false usage
* Re-enable BCL bookmarks, keep them base64
* Fix nullable error
* Prefix all bookmarks with a platform key
* Fix devtools breaking sandboxed app
* Try to read errors after saving bookmark
* Don't crash sample app if has no access
* Add internal IStorageItemWithFileSystemInfo abstraction
* Log information if OpenSecurityScope returned false
* Fix build
* Prefix bookmarks with "ava.v1."
* Support opening old-style bookmarks to avoid breaking changes
* Add failing KeySpline tests
* Fix Animator for progress values less than zero
---------
Co-authored-by: Jumar Macato <16554748+jmacato@users.noreply.github.com>
* Added failing test for #15201.
* Handle nested BindingNotifications.
When #13970 was written, [a check](https://github.com/AvaloniaUI/Avalonia/pull/13970/files#diff-cfb25a491b9452e1815aa2c0d71465aaf81e99792a88a04a1a2ed572fd1930ffR60) was added to ensure that nested `BindingNotification`s didn't happen, and the refactor was written with the assumption that they wouldn't happen.
The problem is that they _do_ happen: when a source object implements both `INotifyDataErrorInfo` and had data annotations, then the nested data validation plugins would each wrap the value coming from the previous plugin in a new `BindingNotification`, resulting in nested `BindingNotifications`.
This adds support for nested binding notifications back in - even though IMO nesting binding notifications is a bug, if we're doing it and we previously supported it then we should continue to support it.
Fixes#15201
* Added failing tests for #15081.
* Provide target property in BindingExpression ctor.
Usually it is not necessary to provide the target property when creating a `BindingExpression` because the property will be assigned when the binding expression is attached to the target in `BindingExpressionBase.Attach`.
This is however one case where `Attach` is not called: when the obsolete `binding.Initiate` method is called and then an observable is read from the `InstancedBinding` without the binding actually being attached to the target object. In this case, prior to the binding refactor in #13970 the value produced by the observable was still converted to the target type. After #13970, because the target property (and hence the target type) is not yet set, the conversion is to the target type is no longer done.
`DataGrid` uses this obsolete method when editing cells, causing #15081. Ideally we'd fix that in `DataGrid` but I'm not happy making this change so close to 11.1, so instead fix this use-case to behave as before.
Fixes#15081
* test: CommandParameter does not change between CanExecute and Execute
* feat: CommandParameter does not change between CanExecute and Execute
* test: update
* Add FuncValueConverter with parameter support
* Fix summary comment
* Fix summary comment
* Add Equal and NotEqual converters to a ObjectConverters class
* Fix condition for Equal
* Added ObjectConverters unit tests
* Add .NET 8 target to packable projects
* Update test projects
* Update sample projects to target .NET 8
* Update main Avalonia package to target .NET 8 as well
* Remove MSBuildEnableWorkloadResolver hack and some minor change
* Use net8.0 in nuke build as well
* Pin 8.0.0 SDK
* Adjust API validation
* Pin a valid version
* Remove net461 target from Avalonia package
* Remove unused net6.0 target from Avalonia.Designer.HostApp
* Adjust API diff
* Update ControlCatalog.Android.csproj
* Remove MSBuildEnableWorkloadResolver
* Fix Browser issues on .NET 8
* Fix .NET 8 error
* Fix merge conflicts
* Replace explicit TFMs in .csproj files with a centralized registry
* Fix merge conflict
* Fix AvsLegacyWindowsTargetFrameworks and add hacks for the tests
* Update XCode project CommandLineArgument
---------
Co-authored-by: Nikita Tsukanov <keks9n@gmail.com>
* Fix AvaloniaSynchronizationContext always using UIThread
* Fix DispatcherOperation TaskSource initialization which caused some exception to be swallowed
* Implement Dispatcher.UnhandledException and Dispatcher.UnhandledExceptionFilter
* Add new internal Dispatcher.Send method without async semantics, use it in SyncContext
* Add tests, partially ported from WPF
* Make Input events go through Dispatcher.UIThread.Send
* Make Dispatcher.ExceptionDataKey internal, so it can be used in XPF
* Some Dispatcher.Send fixes
* Fix Headless tests after SynchronizationContext changes (it relied on global UIThread)
* Fix Send InvokeImpl usage
* Do not wrap AvaloniaSynchronizationContext.Ensure in the Send
---------
Co-authored-by: Nikita Tsukanov <keks9n@gmail.com>
* Added more OneWayToSource tests.
One of whom is failing.
* Don't public value for OneWayToSource bindings.
Looks to have been a brainfart. This allows `OneWayToSource` bindings to read-only properties.
* Init
* Remove XY navigation cache as it's no use
* Use pooled collection for XY navigation
* Restructure code a bit, fix IScroller handling
* Init KeyboardNavigationTests_XY tests
* Simplify XYFocus.GetNextFocusableElement usage
* Minor fixes
* Add more tests
* Remove unused NuiKeyboardNavigationHandler
* Finalizing
* Fix tests
* Add TODO12
* Make XYFocusOptions a class
* Add TestServices.FocusableWindow and make KeyboardNavigationHandler lazy, as it can't be reused on multiple windows
* Fix KeyboardNavigationHandler events handling, when focus was not actually changed
* Add arrow key tests
* Replace XYFocusKeyboardNavigationMode with more flexible XYFocusNavigationModes, integrate with KeyDeviceType input types
* Make XY focus navigation less broken, when there is no starting focused control
* Several Android TV compatibility improvements
* Remap tizen Back button to Esc
* Introduce internal XYFocusHelpers
* Make ComboBox and AutoCompleteBox handle Key events only when it's needed
* Make TextBox handle Key events only when it's needed
* Ignore Alt+Down when XY navigation is enabled in CalendarDatePicker and SplitButton
* Rename IsAllowedXYNavigationMode
* Fix ButtonSpinner with XY navigation
* Implement a very simple focus engagement for GridSplitter and Slider
* Add BackgroundSizing enum
* Improve formatting in RoundedRect
* Add the BackgroundSizing property to relevant controls
* Add new GeometryBuilder helper
This is based on new ideas and APIs in both WinUI and WPF
* Support BackgroundSizing in BorderRenderHelper
This also removes the last remnants of dash array support in the internal APIs
* Remove old code in BorderRenderHelper moved to GeometryBuilder
* Move Rectangle shape geometry calculation into GeometryBuilder
* Add RadiusX/Y properties to RectangleGeometry
* Use RectangleGeometry directly in the Rectangle shape
Since RectangleGeometry now supports RadiusX/Y there is no longer a need to have a separate geometry creation path.
* Add WinUI-based CalculateRoundedCornersRectangle() method
* Simplify and use the WinUI-algorithm in BorderRenderHelper
* Update GeometryBuilder.DrawRoundedCornersRectangle() based on WinUI
* Remove obsolete WPF-based CalculateRoundedCornersRectangle method
* Update CalculateRoundedCornersRectangleAlternate
* Update GeometryBuilderTests
* Fix merge
* Remove unused dashed line properties in BorderRenderHelper
These were already removed in master but could not be merged directly because of the new backgroundSizing parameter.
* Optimize CalculateRoundedCornersRectangle
In the worse-case up to three Point structs were created during calculation for each keypoint. Now doubles are used during calculations so the Point is created once at the end.
* Adjust corner radius calculation within custom GeometryBuilder.CalculateRoundedCornersRectangle()
Corner radius is defined at the center of the border stroke rather than the outside edge.
* Simplify code in WinUI's algorithm for CalculateRoundedCornersRectangle()
* Remove extra BorderRenderHelper.RenderCore method
This method does not need to be separate from Render.
* Add more CalculateRoundedCornersRectangle tests and adjust method naming
* Remove custom CalculateRoundedCornersRectangle() algorithm and always use the WinUI one
* Remove some AggressiveInlining attributes
* Make parameters clear
* Pass RoundedRectKeypoints by ref
* Use GeometryCombineMode.Exclude to better calculate border geometries
* Update BorderPage.xaml to include BackgroundSizing API
---------
Co-authored-by: Max Katz <maxkatz6@outlook.com>
* Update ncrunch config.
* WIP: Benchmarks
* Initial refactor of binding infrastructure.
- `ExpressionObserver` has been removed and its functionality merged with `BindingExpression`
- `BindingExpression` handles all types of `BindingMode` itself; doesn't require `BindingOperations.Apply` to set up a separate observable for `TwoWay/`OneWayToSource` bindings
- This allows us to fix some long-standing issues with `OneWayToSource` bindings
- Expression nodes have been refactored
- No longer split between `Avalonia.Base` and `Avalonia.Markup`
- Categorize them according to whether they use reflection or not
A few tests are failing around binding warnings: this is because the next step here is to fix binding warnings.
* Make default binding Source = UnsetProperty.
Null is a theoretically valid value for `Source`; setting it to null shouldn't mean "use the data context".
* Move logging to BindingExpression.
As `BindingExpression` now has enough information to decide when it's appropriate to log an error/warning or not.
Fixes#5762Fixes#9422
* Add compatibility hack for older compiled bindings.
Previously, `CompiledBindingPathBuilder` didn't have a `TemplatedParent` method and instead the XAML compiler rewrite templated parent bindings to be a `$self.TemplateParent` property binding. resulting in extraneous logs.
Add a constructor with an `apiVersion` to `CompiledBindingPathBuilder` which will be used by newer versions of the XAML compiler, and if a usage is detected using an `apiVersion` of 0, then upgrade `$self.TemplatedParent` to use a `TemplatedParentPathElement`.
* Log errors from property accessors.
* Don't log errors for named control bindings...
...on elements which aren't yet rooted.
* Log errors for failed conversions.
* Use consistent wording for binding warnings.
"Could not convert" instead of "Cannot convert".
* Log warnings for converter exceptions.
* Don't convert new TargetTypeConverters each time.
* Added failing test for implicit conversion.
* Support cast operators in compiled bindings.
A bit of a hack as we'd ideally not be using reflection when using compiled bindings.
* This shouldn't be a public API.
Should only be used for tests.
* Make enum/int conversion work.
* Check for SetValue equality after conversion.
And also use "identity equals" where value types and strings use `object.Equals` and reference types use `object.ReferenceEquals`.
* Added ConverterCulture back to bindings.
* Fix merge error.
Removed deleted files from csproj that were re-added due to indentation changes.
* Use BindingExpression directly in ValueStoe.
* Introduce BindingExpressionBase.
And `UntypedBindingExpressionBase`.
* Make TemplateBinding a BindingExpression.
* Make DynamicResource use a BindingExpression.
* WIP: Start exposing a BindingExpression API.
* Finish exposing a BindingExpression API.
* Fix OneTimeBinding.
* Remove unneeded classes/methods.
* Don't call obsolete API.
* Make BindingExpressionBase the public API.
This matches WPF's API.
* Added BindingExpressionBase.UpdateTarget.
* Initial implementation of UpdateSourceTrigger.
* Don't use weak references for values.
If they're boxed values, they can get collected.
* No need for virtual/generic methods here now.
* Reintroduce support for binding anchors.
Turns out these were needed by animations, just our animation system has no unit tests so I missed that fact earlier. Add a basic animation unit test that fails without anchor support, and add binding anchors back in. Currently a private API as I suspect this feature shouldn't be needed outside the framework.
* Include new property in clone.
And add real-life example of `UpdateSourceTrigger=LostFocus` to BindingDemo.
* Fix merge error.
* Updated BindingExpression tests.
- Make them run for both compiled and reflection bindings (found a bunch of tests that fail with compiled bindings)
- Make them not depend on converting the `BindingExpression` to an observable and instead test the end result of the binding on an `AvaloniaObject`
* Fix compiled binding indexer tests.
* Use data validation plugins in PropertyAccessorNode.
Added a warning suppression for now: we may need a separate `DataValidators` list for AOT-friendly plugins.
* Don't separate plugins by reflection.
`DataAnnotationsValidationPlugin` is public and so it can't be moved. No point in moving the others if this one will be in the wrong place.
* Remove unneeded methods.
* Make reflection binding tests use a string.
Convert the `System.Linq.Expression` to a string and then use this, as reflection bindings will always be instanced with a string path.
* Added TODO12 plan for IBinding2.
* Use more specific exception.
* Fix nits from code review.
* Make expression nodes sealed where possible.
* Unsubscribe on Stop, don't re-subscribe.
D'oh.
* Tweak ExpressionNode lists.
Saves a few K in benchmarks and it's a cleaner API.
* Add a pooled option in BindingExpressionGrammar.
Micro-optimization.
* Avoid allocations when enumerating binding plugins.
* Add IBinding2 support to observable bind overloads.
In the case of `TemplateBinding`, the `IObservable<object?>` bind overload is selected by C#. Add an explicit check for an `IBinding2` here to use the more performant code-path.
* Remove disposed binding from ImmediateBindingFrame.
* Added TemplateBinding benchmarks.
* Remove duplicate items.
Seems to have been caused by a merge error.
* Fix exception when closing color picker.
And add tests.
* Don't skip converter when binding to self.
* Don't pass UnsetValue to converters.
This follows WPF behavior.
* Log element name if present.
More useful than just logging the control hash code.
* Respect binding priority.
* Throw on mismatched binding priorities.
We don't want to respect the binding priority in this case as it breaks `TemplateBindings` when the default `LocalValue` priority is passed. Instead make sure that the priority parameter matches that of the expression.
This reverts commit a72765d705.
* Convert to target type in TemplateBinding.
* Short-circuit target type conversion for same types.
They implicitly create a new `MediaContext` via the following stacktrack, which can break subsequent tests:
```
Avalonia.Media.MediaContext..ctor(Dispatcher dispatcher) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\Media\MediaContext.cs:line 44
at Avalonia.Media.MediaContext.get_Instance() in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\Media\MediaContext.cs:line 68
at Avalonia.Layout.LayoutManager.QueueLayoutPass() in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 356
at Avalonia.Layout.LayoutManager.InvalidateMeasure(Layoutable control) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\Layout\LayoutManager.cs:line 73
at Avalonia.Layout.Layoutable.AncestorBecameVisible(ILayoutManager layoutManager) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 837
at Avalonia.Layout.Layoutable.OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\Layout\Layoutable.cs:line 803
at Avalonia.Input.InputElement.OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\Input\InputElement.cs:line 661
at Avalonia.Controls.Control.OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Controls\Control.cs:line 533
at Avalonia.AvaloniaObject.OnPropertyChangedCore(AvaloniaPropertyChangedEventArgs change) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\AvaloniaObject.cs:line 649
at Avalonia.Animation.Animatable.OnPropertyChangedCore(AvaloniaPropertyChangedEventArgs change) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\Animation\Animatable.cs:line 191
at Avalonia.AvaloniaObject.RaisePropertyChanged[T](AvaloniaProperty`1 property, Optional`1 oldValue, BindingValue`1 newValue, BindingPriority priority, Boolean isEffectiveValue) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\AvaloniaObject.cs:line 700
at Avalonia.PropertyStore.EffectiveValue`1.SetAndRaiseCore(ValueStore owner, StyledProperty`1 property, T value, BindingPriority priority, Boolean isOverriddenCurrentValue, Boolean isCoercedDefaultValue) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\PropertyStore\EffectiveValue`1.cs:line 235
at Avalonia.PropertyStore.EffectiveValue`1.SetLocalValueAndRaise(ValueStore owner, StyledProperty`1 property, T value) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\PropertyStore\EffectiveValue`1.cs:line 74
at Avalonia.PropertyStore.ValueStore.SetLocalValue[T](StyledProperty`1 property, T value) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\PropertyStore\ValueStore.cs:line 220
at Avalonia.PropertyStore.ValueStore.SetValue[T](StyledProperty`1 property, T value, BindingPriority priority) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\PropertyStore\ValueStore.cs:line 196
at Avalonia.AvaloniaObject.SetValue[T](StyledProperty`1 property, T value, BindingPriority priority) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\AvaloniaObject.cs:line 336
at Avalonia.Visual.set_IsVisible(Boolean value) in D:\projects\AvaloniaUI\Avalonia\src\Avalonia.Base\Visual.cs:line 233
```
* add IsEffectivelyVisible test
* test IEV update
* update self and descendants
* sync from parent's isvisible and own on attach/detach
* update test
* update from review
* add comments
* remove whitespace changes
* Added some more IsEffectivelyVisible tests.
One failing.
* Rework UpdateIsEffectivelyVisible.
- Pass the parent state to `UpdateIsEffectivelyVisible`
- Remove some unneeded methods
- Update `IsEffectivelyVisible` before calling visual tree attach/detach events.
---------
Co-authored-by: Steven Kirk <grokys@users.noreply.github.com>
* Adds the ImmutablePenWithDynamicBrush and fixes Border and Shape border re-rendering when changing Brush value
* Removes the ImmutablePenWithDynamicBrush, rollback to Pen
* Cache and reuse Pen
* Move all Pen's updating logic to Pen.TryModifyOrCreate
* Add some tests for Pen.TryModifyOrCreate
* Add proper handling for DashStyle
* Invert condition in Pen.TryModifyOrCreate, fixes the logic
---------
Co-authored-by: Max Katz <maxkatz6@outlook.com>
Co-authored-by: Tim <47110241+timunie@users.noreply.github.com>
* Updated RenderDataRectangleNode.HitTest to properly hit-test rounded rectangles.
* Moved rounded rectangle contains logic to the RoundedRect struct, added unit tests, and refactored previous RenderDataRectangleNode changes.
* Fixed a comment typo.
* Added a private access modifier to a method.
* Don't alter state in properties.
The `IValueEntry.HasValue` and `ValueFrame.IsActive` properties could alter state, which meant that when inspecting objects with these properties in a debugger, the state got altered by observing it. Make them methods.
* Deleted unused file.
* Add failing test for #12381.
* Use the index from the event in EvaluateIsActive.
Break the rules in this case.
Fixes#12381
---------
Co-authored-by: Max Katz <maxkatz6@outlook.com>