These are chat archives for AvaloniaUI/Avalonia

22nd
Nov 2017
Tom Dowdell
@tomdowdell
Nov 22 2017 03:21
I am excited to learn more about Avalonia but am running into problems just getting started. First, attempting to clone AvaloniaVS fails with Server error. Then downloaded VS 2017 extension from your DropBox instead, but affter creating project and opening MainWindow.XAML, VS 2017 croaks. Finally, tried to download the demo per https://www.hanselman.com/blog/WhatWouldACrossplatformNETUIFrameworkLookLikeExploringAvalonia.aspx but nothings there.
Nikita Tsukanov
@kekekeks
Nov 22 2017 06:44
@grokys It seems that we have to get rid of value tuples
There will be issues with our compiled assemblies otherwise
That one should work
GoldyD
@GoldyD
Nov 22 2017 07:37

In class Avalonia.Reactive.WeakPropertyChangedObservable
private readonly Subject<object> _changed = new Subject<object>();

_changed is Disposable but have no call Dispose it is true?

Nikita Tsukanov
@kekekeks
Nov 22 2017 08:00
Yep, that's how weak subscriptions work
If you have no intention of unsubscribing until you object is GCed
You just keep the reference to your subscription in a field
There is an option of explicitly unsubscribing by calling Dispose
Hm, actually, that's another case, but dispose still isn't needed there
ksigne
@ksigne
Nov 22 2017 08:50
@grokys maybe it will be good to reuse code at least. e.g. making static method Border.DrawBorder(Thickness t, Brush b, Pen p, double cornerRadius) and calling it from both Border instance and ContentPresenter instance
Nikita Tsukanov
@kekekeks
Nov 22 2017 08:53
It needs to cache geometry
So it can't be static
ksigne
@ksigne
Nov 22 2017 08:54
why cache can't be static as well?
this geometry is domain-free
Nikita Tsukanov
@kekekeks
Nov 22 2017 08:56
static variables lead to hard-to-debug memory leaks
ksigne
@ksigne
Nov 22 2017 08:58
you still have singletones like Application.Current, don't u?
Nikita Tsukanov
@kekekeks
Nov 22 2017 08:59
That's mostly caused by historical reasons
And all other frameworks having global Application class
I'm also strongly against anything that references platform-specific code in static context
We can have different windowing/drawing backends in one application
e. g. widgets being embedded in WPF while we render dialog windows using our own infrastructure
devtools being rendered over tcp/ip for iOS/Android
etc
ksigne
@ksigne
Nov 22 2017 09:01
So logically one can keep this cache in PlatformImpl?
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:02
I guess so
But Border itself doesn't have a PlatformImpl
ksigne
@ksigne
Nov 22 2017 09:02
but Border.Root? or how it goes should have
and if it doesn't, it can't render itself, isn't it?
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:03
Are you sure that it makes sense to share geometries across different Border instances?
I was thinking about some kind of BorderRenderHelper with Thickness, CornerRadius and Render()
ksigne
@ksigne
Nov 22 2017 09:04
idk why it isn't, while this geometries are absolutely identical
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:04
We need custom geometries for borders with non-uniform thickness and corner radius
ksigne
@ksigne
Nov 22 2017 09:05
but geometry production function is still "pure" function
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:05
uniform thickness can be handled by a regular DrawRectangle call
It's "pure", but tesselation is expensive
ksigne
@ksigne
Nov 22 2017 09:05
i mean geometries for different borders with same size, thickness and corner radius are identical
so you could keep them in HashTable or smth
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:06
How are you planning to free them when they are no longer needed?
ksigne
@ksigne
Nov 22 2017 09:08
you cannot guess if they are needed or not, so it's pure heuristic
you can limit cache size and partially drop it when it exceeded
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:08
I'd rather have a reference to a geometry in Border.cs itself
ksigne
@ksigne
Nov 22 2017 09:09
and copy-paste this code to ContentPresenter?
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:09
I was thinking about some kind of BorderRenderHelper with Thickness, CornerRadius and Render()
ksigne
@ksigne
Nov 22 2017 09:10
will it be less expensive than just place border to ContentPresenter visual tree?
GoldyD
@GoldyD
Nov 22 2017 09:19

Class Avalonia.Controls
Method ChildrenChanged

case NotifyCollectionChangedAction.Reset: controls = e.OldItems.OfType<Control>().ToList(); LogicalChildren.Clear(); VisualChildren.Clear(); VisualChildren.AddRange(_children); break;

controls variable filled but not used - remove?

ksigne
@ksigne
Nov 22 2017 09:20
is here something like Binding.DoNothing?
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:23
@GoldyD seems to be a leftover from some copy-pasted code, thanks
That whole case looks suspicious
ksigne
@ksigne
Nov 22 2017 09:27
i can use BindingNotification as substitute to Binding.DoNothing, but it requires me push error. but there is no error :)
Is that intended?
GoldyD
@GoldyD
Nov 22 2017 09:28
Also in switch no case label for NotifyCollectionChangedAction.Move enum value
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:29
support for Move is not really required here
Since items will stay logical/visual children of the panel
There might be issues with render order though
GoldyD
@GoldyD
Nov 22 2017 09:31
May be raise exception in this case?
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:32
It seems that Reset never happens
Because AvaloniaList triggers Remove notification on Clear by default
It also doesn't trigger Move notifications
Hm, wait, it does
Tracked in AvaloniaUI/Avalonia#1286
ksigne
@ksigne
Nov 22 2017 09:37
@kekekeks so why wouldn't you allow DoNothing?
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:38
I think it's just not yet implemented for some reason
What do you need it for?
ksigne
@ksigne
Nov 22 2017 09:40
enum converter
quickfix i made on local
 if (notification == BindingNotification.UnsetValue)
                            return;
hard to guess how it should really be implemented
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:42
in case of unsetvalue binding should check for fallbackvalue, I guess
ksigne
@ksigne
Nov 22 2017 09:42
yeah, but that's not unsetvalue but bindingnotification.unsetvalue
different objects
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:43
we need @grokys here
ksigne
@ksigne
Nov 22 2017 09:43
old wpf trick when you binding enum to multiple objects (e.g. radiobuttons, togglebuttons) and doing Binding.DoNothing in ConvertBack
so for simple way it's a single line fix in BindingExpression.cs
but i don't know how it meant to be:(
Sergey
@PurpleGray
Nov 22 2017 09:49
I want to estimate how much work needs to be done to port Prism framework to Avalonia. I've heard someone already done some work in this direction. So im here with question before starting my investigation in depths of Prism, is there any working concepts, or anything you can tell me about this subject.
Steven Kirk
@grokys
Nov 22 2017 09:50
hey hey
yeah that looks like a bug in Panel - logical children should be re-populated
Sergey
@PurpleGray
Nov 22 2017 09:51
@kekekeks thx
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:51
I've checked AvaloniaList again, it uses Reset by default
@grokys check #1286
Steven Kirk
@grokys
Nov 22 2017 09:52
yeah, that looks like it needs fixing - need to add unit tests!
it's super-old code from before things got serious
regarding BindingNotification.DoNothing - it's not in there because i've never used it and wasn't sure of its uses cases
ksigne
@ksigne
Nov 22 2017 09:53
i use it :)
Steven Kirk
@grokys
Nov 22 2017 09:53
could you file an issue with your use-case?
ksigne
@ksigne
Nov 22 2017 09:53
simple
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (targetType == typeof(bool) || targetType == typeof(bool?))
                return value.ToString() == parameter.ToString();            
            return null;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null) return BindingNotification.UnsetValue;
            var s = Enum.Parse(targetType, parameter.ToString(), true);
            return value.Equals(true) ? s : BindingNotification.UnsetValue;
        }
not a best practice, but simple and reliable
Nikita Tsukanov
@kekekeks
Nov 22 2017 09:54
@Stratocast3r Prism.Core seems to be ported to .NETStandard already
So you only need a framework-support package
ksigne
@ksigne
Nov 22 2017 09:54
used to bind radiobuttons to enum in modelview
Steven Kirk
@grokys
Nov 22 2017 09:55
an issue would be best, things tend to get lost here ;)
i will definitely add that
ksigne
@ksigne
Nov 22 2017 09:56
i can do PR out of it
Steven Kirk
@grokys
Nov 22 2017 09:57
ok sure, but add an issue first ;)
so we can discuss the implementation if necessary
i prefer to have an issue for a PR these days
ksigne
@ksigne
Nov 22 2017 10:00
yeah ok
Steven Kirk
@grokys
Nov 22 2017 10:01
@kekekeks so we can't use ValueTuple in the API? are you talking about dotnet/standard#567 or a wider problem?
Nikita Tsukanov
@kekekeks
Nov 22 2017 10:06
Yes, we shouldn't use it until that issue is fixed
GoldyD
@GoldyD
Nov 22 2017 10:44
Class Avalonia.Controls.Html.HtmlControl
protected readonly HtmlContainer _htmlContainer;
Need to be Disposed?
Nikita Tsukanov
@kekekeks
Nov 22 2017 10:47
No idea, code was ported from https://github.com/ArthurHub/HTML-Renderer
I don't see it being disposed here
So, probably, it doesn't
Steven Kirk
@grokys
Nov 22 2017 10:51
@GoldyD are you running code analysis on the codebase looking for CA2213?
that warning gives so many false positives it's actually dangerous IMO
GoldyD
@GoldyD
Nov 22 2017 10:54
Yes
I manually check each warning for avoid false positive
In this case variable created in class and has IDisposable implementation that not called - it is strange
I don't see it disposing any unmanaged resources
I also don't think it can own any unmanaged resources
So it's probably some deinitialization pattern to unroot expensive objects
danwalmsley
@danwalmsley
Nov 22 2017 12:13
@kekekeks im finding that in AvaloniaEdit, somehow the texteditor gets into a wierd state where ArrangeOverride no longer gets called, event if Iv called invalidatearrange immediately before! any ideas what can stop this happening?
Nikita Tsukanov
@kekekeks
Nov 22 2017 12:15
Check if it's attached to the visual tree
danwalmsley
@danwalmsley
Nov 22 2017 12:15
ok
btw im calling InvalidateVisual
is it safe to assume this would trigger arrange pass?
Nikita Tsukanov
@kekekeks
Nov 22 2017 12:17
Nope
Invalidating visual triggers a render pass
danwalmsley
@danwalmsley
Nov 22 2017 12:17
InvalidateVisual(); // = InvalidateArrange+InvalidateRender
this comment was in the avaloniaedit code :(
ok right well now I know how to fix it I think
Nikita Tsukanov
@kekekeks
Nov 22 2017 12:18
I'm pretty sure it is not
danwalmsley
@danwalmsley
Nov 22 2017 12:19
ok ill have to try the editor out for a while before I know if this fixes it
im manually calling InvalidateArrange and InvalidateVisual seperately now
Nikita Tsukanov
@kekekeks
Nov 22 2017 12:20
Measure/Layout pass for particular element is triggered in 2 cases:
1) InvalidateMeasure/Arrange is called while IsMeasureValid/IsArrangeValid == true
These methods will set corresponding properties to false
2) Visual gets attached to the visual tree when IsMeasureValid/IsArrangeValid == false
So it might get into broken state if InvalidateMeasure/InvalidateArrange were called when visual was outside of the visual tree and for some reason OnAttachedToVisualTree wasn't called
danwalmsley
@danwalmsley
Nov 22 2017 12:25
ok
thanks
Nikita Tsukanov
@kekekeks
Nov 22 2017 12:25
There also might be a swallowed exception during layout pass
Which isn't really a recoverable thing
danwalmsley
@danwalmsley
Nov 22 2017 12:26
yeah I reckon something like that might be happening
edit starts doing wierd shit
like text disapears
but caret, etc remains
and then it comes back and disapears
then things like you scroll and everything moves apart from text
but its only after you have done lots of stuff, iv no way of definately triggering this state yet
hmmm it just did it
checking if its attached correctly
danwalmsley
@danwalmsley
Nov 22 2017 12:35
its definately getting skipped
not quite sure why yet
going to try on vs
danwalmsley
@danwalmsley
Nov 22 2017 14:52
@kekekeks is it possible to get the data from a normal bitmap and transfer it to a writeable bitmap?
Nikita Tsukanov
@kekekeks
Nov 22 2017 15:01
Create a frame buffer on top of the writable bitmap and draw your bitmap into it
Not the most optimal solution, but should work
danwalmsley
@danwalmsley
Nov 22 2017 15:02
ok
also I think my layout problem might be this...
public void InvalidateArrange(ILayoutable control)
        {
            Contract.Requires<ArgumentNullException>(control != null);
            Dispatcher.UIThread.VerifyAccess();

            if (!control.IsAttachedToVisualTree)
            {
#if DEBUG
                throw new AvaloniaInternalException(
                    "LayoutManager.InvalidateArrange called on a control that is detached from the visual tree.");
#else
                return;
#endif
            }

            _toArrange.Enqueue(control);
            QueueLayoutPass();
        }
this doesn't get called if IsArrangeValid = false... meaning it never gets added to the queue
public void InvalidateMeasure()
        {
            if (IsMeasureValid)
            {
                Logger.Verbose(LogArea.Layout, this, "Invalidated measure");

                IsMeasureValid = false;
                IsArrangeValid = false;

                if (((ILayoutable)this).IsAttachedToVisualTree)
                {
                    LayoutManager.Instance?.InvalidateMeasure(this);
                    InvalidateVisual();
                }
                OnMeasureInvalidated();
            }
        }
look here, it sets IsArrangeValid = false... but never calls
LayoutManager.Instance?.InvalidateArrange(this);
ok forget all that
danwalmsley
@danwalmsley
Nov 22 2017 15:08
@kekekeks let me know if you have time on TV to have a look, I'll try not to close debugger session
hmmm this doesn't look righ?
Nikita Tsukanov
@kekekeks
Nov 22 2017 15:10

this doesn't get called if IsArrangeValid = false... meaning it never gets added to the queue

Additing control to measurement queue automatically queues it for a layout pass

danwalmsley
@danwalmsley
Nov 22 2017 15:10
image.png
to arrange count 3409

to arrange count 3409

Are you sure that there weren't any swallowed exceptions?

danwalmsley
@danwalmsley
Nov 22 2017 15:11
my toArrangeCount is growing and growing, its never getting processed
iv not seen anything printed out on the command line
or console
danwalmsley
@danwalmsley
Nov 22 2017 15:12
iv also get debugger set to catch all handled exceptions too
Nikita Tsukanov
@kekekeks
Nov 22 2017 15:12
Check for LayoutManager's state
_queued and _running fields specifically
danwalmsley
@danwalmsley
Nov 22 2017 15:15
they are working fine
ok more info
it looks like one of my controls
inside its measure override
it always calls invalidateArrange
no its not doing that
ignore
private void ExecuteArrangePass()
        {
            while (_toArrange.Count > 0 && _toMeasure.Count == 0)
basically it never parses all my arrange
because in some of the arranges measure count increases!
Nikita Tsukanov
@kekekeks
Nov 22 2017 15:17
So, a new measure pass gets queued, right?
danwalmsley
@danwalmsley
Nov 22 2017 15:18
yeh
and then it doesn't do the layouts
that would be a design flaw in the control right?
There is a hardcoded limit of 3 layout passes
Why are you invalidating measure inside Arrange?
danwalmsley
@danwalmsley
Nov 22 2017 15:19
I didn't write this code :(
its this...
I'm just trying to fix it
Nikita Tsukanov
@kekekeks
Nov 22 2017 15:23
Something might be wrong with priorities
It uses dispatcher here for a reason
danwalmsley
@danwalmsley
Nov 22 2017 15:28
im lets see what breaks when it always uses dispatcher
seems better
@aelij you still around?
do you know why this code was like that?
danwalmsley
@danwalmsley
Nov 22 2017 15:39
hmmm didn't fix it
@kekekeks iv got TV and debugger session ready to go, if you might have a few mins to look?
Nikita Tsukanov
@kekekeks
Nov 22 2017 15:54
@grokys Some of our controls (e. g. VirtualizingStackPanel) invalidate their measure during Arrange pass
Which leads to Arrange pass being aborted
Then it exceeds MaxPasses = 3
And leaves a bunch of elements with arrange queued
There are also properties
That affect measure
And might be changed during Arrange pass too
danwalmsley
@danwalmsley
Nov 22 2017 15:57
@kekekeks do you have an example of converting Bitmap to WriteableBitmap
via framebuffer?
See these two tests
danwalmsley
@danwalmsley
Nov 22 2017 15:58
@kekekeks with maxpasses = 30 still same issue
must be some kind of recursion
do you want to come back and see?
Nikita Tsukanov
@kekekeks
Nov 22 2017 16:04
Hm, InvalidateMeasure call is in Panel itself, actually
I wonder how WPF handles that
Steven Kirk
@grokys
Nov 22 2017 16:10
@kekekeks yeah, we might need to up MaxPasses?
invalidating measure during arrange is something we have to support unfortunately, there's no way around it i don't think
Nikita Tsukanov
@kekekeks
Nov 22 2017 16:11
According to @danwalmsley that does not help
How WPF supports that
Does it stop the current arrange pass too?
danwalmsley
@danwalmsley
Nov 22 2017 16:15
@kekekeks im back
Nikita Tsukanov
@kekekeks
Nov 22 2017 16:30
@grokys I think we should defer all InvalidaMeasure calls during Arrange pass
Steven Kirk
@grokys
Nov 22 2017 16:31
if that works, i'd be :+1: with that
the way it currently works should kinda work like that anyway though
if InvalidateMeasure is called during arrange pass, the process is started again
but there's a limit of 3 times to prevent an infinite loop
tbh i think WPF uses a much higher value
does increasing MaxPasses help?
Jeremy Koritzinsky
@jkoritzinsky
Nov 22 2017 16:34
WPF might do a similar thing I'm doing with bindings in #856. Not abort the pass but queue another one afterwards so we don't go into a loop.
@danwalmsley mentioned above that increasing MaxPasses doesn't work.
Nikita Tsukanov
@kekekeks
Nov 22 2017 16:44
The problem is that if we remove the check for _toMeasure.Count
Then it freezes doing Arrange calls that in turn call Measure
Which invalidates arrange again
InvalidateMeasure in ChildrenChanged from VirtualizingStackPanel causes it to explode
Nikita Tsukanov
@kekekeks
Nov 22 2017 16:49
_toMeasure never gets empty
Yep, that's VirtualizingStackPanel
If I remove InvalidateMeasure it works fine
Steven Kirk
@grokys
Nov 22 2017 16:52
ok, first thing we need for this is a unit test...
Nikita Tsukanov
@kekekeks
Nov 22 2017 16:54
For now all we have is AS and 3K visuals in _toArrange list
Steven Kirk
@grokys
Nov 22 2017 16:56
if you understand what's happening though, should be too difficult to write a unit test?
don't have to use VirtualizingStackPanel, a dummy panel written specially to trigger the behavior will work
Nikita Tsukanov
@kekekeks
Nov 22 2017 16:58

if you understand what's happening though

we don't

We currently suspect that it's somehow related to VSP getting an infinite size
While not being attached to the visual tree
Nikita Tsukanov
@kekekeks
Nov 22 2017 17:21
@grokys The issue seems to be related to VirtualizingStack panel being inside a ScrollViewer
When the last of the visible items exceeds the width
And causes the ScrollViewer to show horizontal scroll bar
Which, in turn, causes VirtualizingStackPanel to hide said last element
Which, in turn, makes ScrollViewer to hide it's scroll bar
Steven Kirk
@grokys
Nov 22 2017 17:25
right
This message was deleted
that's a common problem...
i thought it should be handled but it's obviously not
that's actually the main reason we need MaxPasses - you need to give up at some point
Nikita Tsukanov
@kekekeks
Nov 22 2017 17:28
The problem is that it cancels the arrange of completely unrelated elements
In case of AS the virtualizing panel lives in a separate window
and breaks the main text view
When I've remove the check for _toMeasure.Count == 0 in ExecuteArrangePass it just freezes
Steven Kirk
@grokys
Nov 22 2017 17:39
hmm yeah i see...
would moving the LayoutManager to be per-window fix this?
Nikita Tsukanov
@kekekeks
Nov 22 2017 17:41
Only partially
Well, actually...
Steven Kirk
@grokys
Nov 22 2017 17:41
so do we need a number of passes per control?
Nikita Tsukanov
@kekekeks
Nov 22 2017 17:42
LayoutManager always calls Arrange on the top most widget, right?
Steven Kirk
@grokys
Nov 22 2017 17:42
the top-most widget that needs an arrange
Nikita Tsukanov
@kekekeks
Nov 22 2017 17:42
So it won't help then
How WPF handles that?
Steven Kirk
@grokys
Nov 22 2017 17:43
WPF's layout logic is scary
Nikita Tsukanov
@kekekeks
Nov 22 2017 17:44
are you talking about GRIDPARANOIA?
Steven Kirk
@grokys
Nov 22 2017 17:44
haha, what's that?
what if we make a copy of the measure/arrange collections and pass those to ExecuteMeasurePass/ExecuteArrangePass?
Nikita Tsukanov
@kekekeks
Nov 22 2017 17:46
I think it freezes AS
Or I've been doing it the wrong way
Steven Kirk
@grokys
Nov 22 2017 17:48
one sec...
let me try something
Nikita Tsukanov
@kekekeks
Nov 22 2017 17:48
Can we borrow the layout logic from Moonlight?
Steven Kirk
@grokys
Nov 22 2017 17:48
it mostly was borrowed from there in the first place
but it's been changed a lot since
Steven Kirk
@grokys
Nov 22 2017 17:56
@kekekeks could you try this LayoutManager? https://gist.github.com/1ff2a816ec069a5986257882ce31f161
Nikita Tsukanov
@kekekeks
Nov 22 2017 17:58
@danwalmsley
ksigne
@ksigne
Nov 22 2017 18:43
omg! why there is no StringFormat on BindingExpression?
Steven Kirk
@grokys
Nov 22 2017 18:56
@ksigne because we're still in Alpha :D
danwalmsley
@danwalmsley
Nov 22 2017 19:01
Perhaps scrollbars should not actually resize the content? I.e. They just paint over the content?
I'm not at pc but will try that commit asap
Nikita Tsukanov
@kekekeks
Nov 22 2017 19:07
StringFormat shouldn't be that hard to implement though
ksigne
@ksigne
Nov 22 2017 19:49
aah wtf
in BindingExtension.cs
return new Binding { Converter = Converter, ConverterParameter = ConverterParameter, ElementName = ElementName, FallbackValue = FallbackValue, Mode = Mode, Path = Path, Priority = Priority, RelativeSource = RelativeSource, DefaultAnchor = new WeakReference(GetDefaultAnchor((ITypeDescriptorContext)serviceProvider)) };
so where is Source?
Steven Kirk
@grokys
Nov 22 2017 20:18
@ksigne looks like it's missing!
ksigne
@ksigne
Nov 22 2017 20:18
you guessed it right!
it broke my architecture with static window controller
once again, single line quickfix :)
Steven Kirk
@grokys
Nov 22 2017 20:19
yep, could you submit a PR?
ksigne
@ksigne
Nov 22 2017 20:20
i will.. a bit later
ksigne
@ksigne
Nov 22 2017 20:27
i have a question
IVirtualizingPanel is supposed only to build new items when we scroll down?
so items that are above viewport won't be destroyed?
Nikita Tsukanov
@kekekeks
Nov 22 2017 20:29
They should be recycled and assigned a new DataContext, I think
ksigne
@ksigne
Nov 22 2017 20:31
so when we place IVirtualizingPanel inside some ScrollViewer, it should handle PixelOffset, right?
i'm just trying to understand how it meant to be
Nikita Tsukanov
@kekekeks
Nov 22 2017 20:32
PixelOffset?
I don't think that we support smooth scrolling for virtualized panels
ksigne
@ksigne
Nov 22 2017 20:33
ok, i got it
jp2masa
@jp2masa
Nov 22 2017 21:40
may I ask why aren't the assemblies signed with a strong name?
Nikita Tsukanov
@kekekeks
Nov 22 2017 21:41
Because it's deprecated and introduces more issues than it solves
jp2masa
@jp2masa
Nov 22 2017 21:41
ok
Steven Kirk
@grokys
Nov 22 2017 21:41
strong name signing is the worst
danwalmsley
@danwalmsley
Nov 22 2017 21:45
@grokys new layout manager I think fixes the bug
but it breaks other things like treeview
Steven Kirk
@grokys
Nov 22 2017 21:45
oh :(
danwalmsley
@danwalmsley
Nov 22 2017 21:45
I wont be 100% sure if it fixes it until I get to my work machine tomorrow so I can do 100% same repro we found earlier
treeview basically
when I expand some items
it doesn't show the children
then if I expand something that it above it in the list
the children that were missing then apear if you follow
I didn't see anything else broken so far
and to be fair iv seen the odd edge case on treeview every now and again
it does also make my popup misbehave a little
Nikita Tsukanov
@kekekeks
Nov 22 2017 21:50
To be honest, even some minor weather changes on Mars will make your intellisense popup misbehave a little
danwalmsley
@danwalmsley
Nov 22 2017 21:51
yeah its always been a bit flaky!
Steven Kirk
@grokys
Nov 22 2017 21:52
yeah i think this problem is going to need some more detailed investigation
danwalmsley
@danwalmsley
Nov 22 2017 21:53
what did you think about my suggestion of making scrollbars sit ontop of the content, not resize content to fit
or would the be a hack?
@kekekeks my intellisense is just a listbox
it doesn't have its own scrollviewer
so this bug should be able to produce a repro by adding a listbox
with a fix height
switch on virtualization
and add some items that don't cause the horizontal bar to show
then scroll down until there is 1 that will cause that
and make sure the item height is <= that of scrollbar height
I think that might basically demo the issue?
Nikita Tsukanov
@kekekeks
Nov 22 2017 22:00

making scrollbars sit ontop of the content, not resize content to fit

That will make parts of the content unreachable by mouse

Which is not a good thing
Overlay scrollbars look better though
danwalmsley
@danwalmsley
Nov 22 2017 22:12
They won't be unreachable because you will be able to scroll to those parts?
Scrollbar will have to apply offset for last part of scrolling or something
I'm going to check wpf to see what its scrollbars do