Asked by:
Xamarin.Forms 1.4.0 Released

Question
-
User352 posted
Same as -pre2 with an additional bug fix for Android ContextActions.
Important Notes
This is a feature release. As such unlike a patch version bump, the minor version bump indicates the inclusion of new APIs.
New API
ScrollView
It is now possible to detect the current scroll offset of the ScrollView. These are readonly bindable properties.
csharp public double ScrollX { get; } public double ScrollY { get; }
There are also methods which can be used to perform scrolling in the ScrollView.
csharp public Task ScrollToAsync (double x, double y, bool animated); public Task ScrollToAsync (Element element, bool animated);
TheElement
passed toScrollToAsync
must be a descendant of theScrollView
but does not have to be a direct child.Finally for those who do not wish to use bindings to observe scrolling, there is a
Scrolled
event that fires whenScrollX
orScrollY
are updated. ```csharp public event EventHandlerScrolled; public class ScrolledEventArgs : EventArgs { public double ScrollX { get; } = 0; public double ScrollY { get; } = 0; } ``` Lastly ScrollView no longer uses any internal API to communicate between the frontend and the renderer.
IScrollViewController
, which is implemented explicitly on ScrollView can be used to trigger these and other events.ListView
Separator Enhancements It is now possible to enable/disable separators for the ListView. This can be configured via the
SeparatorVisibility
property, which is bindable. ```csharp public SeparatorVisibility SeparatorVisibility { get; set; } = SeparatorVisibility.Default;public enum SeparatorVisibility { Default = 0, None = 1, } ``` Currently there is no option for
Always
as not all platforms have separators as part of their UX. We are considering adding this in the future, however it would be an invented paradigm for Windows platforms.It is now possible to apply a
Color
to the separator in ListView.csharp public Color SeparatorColor { get; set; } = Color.Default;
The default value isColor.Default
and will function unchanged from the 1.3.0 implementation if left untouched. RGBA values are supported. This function does nothing inSeparatorVisibility
is set toNone
. Please note that setting either of these properties on Android after loading theListView
incurs a large performance penalty.Header/Footer
ListView
has also grown both a Header and a Footer. These are managed through a series of properties which enable everything from simple usage to more complex MVVM style usage. With Header/Footer the primary reason developers have in the past been forced to put ListViews inside of ScrollViews is finally dead! If you are still placing a ListView inside a ScrollView we strongly suggest you consider porting.csharp public object Header { get; set; } = null; public DataTemplate HeaderTemplate { get; set; } = null; public object Footer { get; set; } = null; public DataTemplate FooterTemplate { get; set; } = null;
It is important to note that Header or Footer may be set directly to a View and the Template properties left null. This will cause the Header/Footer to be directly consumed by the renderer. All of these properties are bindable.Pull To Refresh PullToRefresh has been enabled on all current target platforms for ListView. To enable PullToRefresh in your app simple set
IsPullToRefreshEnabled
to true and make sure you respond to the correct events. It is important to note that this is the "easy" version of this API, in the future a more complete API with a standalone View may be added. ```csharp public event EventHandler Refreshing;public bool IsPullToRefreshEnabled { get; set; } = false; public bool IsRefreshing { get; set; } = false; public ICommand RefreshCommand { get; set; } = null;
public void BeginRefresh (); public void EndRefresh (); ``` When the user triggers a
PullToRefresh
the Command will be invoked and theRefreshed
event emitted.IsRefreshing
will be set to true. TheICommand.CanExecute
property is respected. The user must either callEndRefresh
or assignIsRefreshing
to false in order to end the refresh state.All control parameters for these features and more are exposed through the IListViewController interface, which is explicitly implemented on ListView. This will assist those wishing to modify how these features work in custom renderers.
The Windows Phone implementation of PullToRefresh is a custom implementation as there is no platform idiom for doing this. In the future if the Windows platform decided to add a method of doing PullToRefresh by default, we intend to port.
Forms.Application
The
Application
class now exposes 4 new events for dealing with Modal navigation.csharp public event EventHandler<ModalPushedEventArgs> ModalPushed; public event EventHandler<ModalPoppedEventArgs> ModalPopped; public event EventHandler<ModalPushingEventArgs> ModalPushing; public event EventHandler<ModalPoppingEventArgs> ModalPopping;
TheModalPoppingEventArgs
contains aCancel
property which if set to true will cancel the Pop event and cause the application to enter the background (the operating system is informed of the unhandled back event).In order to implement this feature, all pre-Application methods of creating a Forms app have been updated to create a default
Application
which is set as the root pagesParent
. It is possible this may cause issues in some edge cases, if you have any issues please file a bug report. It is suggested you update your app to the new LoadApplication initialization methodology if possible.Application now has a method of manually forcing the
Properties
dictionary to be saved to the IsolatedFileStore. This is to allow users to save their properties when it makes sense for them rather than risk them not getting serialized out due to a crash/being killed by the OS.csharp public Task SavePropertiesAsync ()
OpenGLRenderer
On Android
OpenGLRenderer
has been renamedOpenGLViewRenderer
for consistency.Layout
Layout now contains a
ILayoutController
class which has anIReadOnlyList<Element>
which can be used to enumerate the children of a Layout regardless of the type of the Layout.Other Features
- WebView now correctly supports javascript out of the box on Windows Phone 8.0
Bug Fixes
- Bug 27063 - Navigation not always returning to the proper page.
- Bug 27225 - Secondary ToolbarItems cause app to hang during PushAsync
- Bug 27437 - [iOS] Context menu error after deleting an item from a ListView using ContextActions
- Bug 27096 - EntryCell has different fontsize on Android
- Bug 21317 - Stepper control .IsEnabled doesn't work on Android
- Bug 26338 - Unable to change page BackgroundImage from code
- Bug 26588 - [WinPhone] Entry does not trigger numeric keyboard when password masking is enabled
- Bug 27072 - Listview Context Actions not removed if a different item is tapped in Android
Other Fixes
- Stepper default values now can be correctly inherited through a style.
- x:Static now correctly reports position on error in XAML.
- XAML now throws a more user friendly error on duplicate x:Name
- XAML will now use implicit operators when assigning values to properties
- XAML now supports baseclass indication for collection properties
- XAML string literals are now supported with
{}foo
- iOS6 Modal pages should no longer sometimes have a 20px offset for no reason
Monday, March 9, 2015 10:46 PM
All replies
-
User70237 posted
I am glad to see Xamarin.Forms is growing, pulltorefresh.., when can we see professinal Tabpage, slidingpage and visiable design?
Tuesday, March 10, 2015 3:52 AM -
User49731 posted
Nice one Jason - great work as always!
Tuesday, March 10, 2015 11:43 AM -
User93655 posted
Awesome :D
Tuesday, March 10, 2015 12:15 PM -
User84378 posted
Might be something on my machine but when I try to compile the Android part of a Xamarin.Forms project and Static Link the SDK I get this:
13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: The "LinkAssemblies" task failed unexpectedly. 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: Xamarin.Android.XamarinAndroidException: error XA2006: Reference to metadata item 'System.Void Android.Widget.AbsListView::SetSelectionFromTop(System.Int32,System.Int32)' (defined in 'Xamarin.Forms.Platform.Android, Version=1.4.0.0, Culture=neutral, PublicKeyToken=null') from 'Xamarin.Forms.Platform.Android, Version=1.4.0.0, Culture=neutral, PublicKeyToken=null' could not be resolved. ---> Mono.Cecil.ResolutionException: Failed to resolve System.Void Android.Widget.AbsListView::SetSelectionFromTop(System.Int32,System.Int32) 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Mono.Linker.Steps.MarkStep.MarkMethod(MethodReference reference) 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Mono.Linker.Steps.MarkStep.MarkInstruction(Instruction instruction) 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Mono.Linker.Steps.MarkStep.MarkMethodBody(MethodBody body) 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Mono.Linker.Steps.MarkStep.ProcessMethod(MethodDefinition method) 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Mono.Linker.Steps.MarkStep.ProcessQueue() 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Mono.Linker.Steps.MarkStep.Process() 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Mono.Linker.Steps.MarkStep.Process(LinkContext context) 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Mono.Linker.Pipeline.Process(LinkContext context) 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at MonoDroid.Tuner.Linker.Process(LinkerOptions options, LinkContext& context) 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Xamarin.Android.Tasks.LinkAssemblies.Execute() 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: --- End of inner exception stack trace --- 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Xamarin.Android.Diagnostic.Error(Int32 code, Exception innerException, String message, Object[] args) 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Xamarin.Android.Tasks.LinkAssemblies.Execute() 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() 13>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1017,5): error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.
d__20.MoveNext() Tuesday, March 10, 2015 12:52 PM -
User101799 posted
Awesome. I love ListView feature updates. However, I could see one breaking issue on the ListView. I used to set (sender as ListView).SelectedItem=null to avoid selection color in the listview. But, now it breaks. Always first item getting selected background(some blue color) even If I set null in the event. Also first Item always getting selected background color even if I select other items. Anything wrong?. Any new property available to avoid selection background?
Tuesday, March 10, 2015 12:57 PM -
User48227 posted
I think there is an issue (probably introduced in a previous version) with HasUnevenRows being set to true on IOS (at least).
The ItemAppearing event fires for all items in the list even if they haven't appeared (presumably because they're loaded in order to measure them)
The problem is though that this breaks my infinite scrolling which I think is the main usecase for the ItemAppearing event.
Please let me know if you can't reproduce this because there's always a chance the situation is more complicated that I have described in which case I'll try to find out why I am seeing this behaviour
Tuesday, March 10, 2015 2:10 PM -
User101799 posted
@Mihai Cvasnievschi : I am also facing same issue.
Tuesday, March 10, 2015 2:37 PM -
User83688 posted
I'm also noticing the same issue as @MartinBooth (Also on IOS)
Tuesday, March 10, 2015 3:14 PM -
User57498 posted
How do you perform a pull to refresh using the Windows Phone emulator? I've tried the swipe down motion that works in iOS and Android, but it does not seem to work for WinPhone. I'm not all that familiar with WinPhone gestures, so I am sure that is the issue. The new pull to refresh works great in iOS and Android!! Nice addition.
Tuesday, March 10, 2015 7:40 PM -
User92610 posted
Updated to 1.4.0 and started getting a crash w/ relativelayout in the xaml. Haven't touched that file and it worked fine before
Xamarin.Forms.Xaml.XamlParseException: Type ConstraintExpressionExtension not found in xmlns at Xamarin.Forms.Xaml.XamlParser.GetElementType (Xamarin.Forms.Xaml.XmlType xmlType, IXmlLineInfo xmlInfo, System.Reflection.Assembly currentAssembly) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.XamlTypeResolver.Resolve (System.String qualifiedTypeName, IServiceProvider serviceProvider) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.XamlTypeResolver.TryResolve (System.String qualifiedTypeName, System.Type& type) [0x00000] in <filename unknown>:0
Tuesday, March 10, 2015 7:43 PM -
User25759 posted
Just blogged on the pull to refresh goodness: http://motzcod.es/post/113280718807/official-pull-to-refresh-in-xamarin-forms-1-4-0
WP is the same, a pull down to refresh
Tuesday, March 10, 2015 8:56 PM -
User57498 posted
I am seeing that pull to refresh on WP only seems to work when there are more rows than can fit on one screen. If, for example, there are only two items in the list view, pulling down on the list does not seem to work. I have tried setting the list views layout options (horizontal and vertical) to FillAndExpand. Also tried as the only control on the page and inside a StackLayout. Is this a bug, or am I missing something? Thanks
Tuesday, March 10, 2015 9:35 PM -
User6349 posted
@ShanePope this is a known issue if you have your code set to break on a XamlParseException. You should be able to continue and it will work as expected. I was able to upgrade to 1.4.0 and load a RelativeLayout Xaml with ConstraintExpressionExtension just fine (but with lots of messages in the debugger).
My guess is that you at some point set your debugger to break on XamlParseException and that is why you are seeing the error now. I could be wrong, though. :)
Here's the bug: https://bugzilla.xamarin.com/show_bug.cgi?id=27730
Tuesday, March 10, 2015 9:36 PM -
User92610 posted
@MikeEEE thanks, Something else was crashing and I just managed to hit that first when I turned on all exceptions.
The actual crash is that my converter stopped working:
<Label Text="{Binding DateOfBirth, Converter={StaticResource DOBLabelConverter}}"/>
It was fine before, I assume it has something to do with the 1.4.0 xaml / static changes?I am defining and referencing the converter inside the resource dictionary. Could that be a problem? It worked in 1.3.5
<ResourceDictionary> <converters:DOBLabelConverter x:Key="DOBLabelConverter"/> ......
System.Exception: Position 35:36. StaticResource not found for key DOBLabelConverter at Xamarin.Forms.Xaml.StaticResourceExtension.ProvideValue (IServiceProvider serviceProvider) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.ApplyPropertiesVisitor.Visit (Xamarin.Forms.Xaml.ElementNode node, INode parentNode) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.RootNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.XamlLoader.Load (Xamarin.Forms.BindableObject view, System.String xaml) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.XamlLoader.Load (Xamarin.Forms.BindableObject view, System.Type callingType) [0x00000] in <filename unknown>:0 at Xamarin.Forms.Xaml.Extensions.LoadFromXaml[ComposeMessagePage] (Company.Mobile.Pages.ComposeMessagePage view, System.Type callingType) [0x00000] in <filename unknown>:0 at Company.Mobile.Pages.ComposeMessagePage.InitializeComponent () [0x0000c] in /Users/shane/GitHub/Company.Mobile/Company.Mobile/obj/Debug/ComposeMessagePage.xaml.g.cs:44 [clipped]
Tuesday, March 10, 2015 9:53 PM -
User48227 posted
@PeteGiles.2978
I have filed a bug (27845) for this issue. I will take a look to see whether I can come up with a workaround this evening
Tuesday, March 10, 2015 10:37 PM -
User6349 posted
@ShanePope ... hmm... not sure. I would have to see the entire Xaml to be sure. Are they in the same file? I of course prefer using singleton instances for my converters... saves a lot of work and you're not having to chase down ResourceDictionary entries half the time. You might want to try that to see if it fixes your problem. Here's an example of setting one up: https://github.com/Michael-DST/xamarin-forms-samples/blob/master/FormsGallery/FormsGallery/FormsGallery/Support/LuminosityConverter.cs#L9
Usage in Xaml: https://github.com/Michael-DST/xamarin-forms-samples/blob/master/FormsGallery/FormsGallery/FormsGallery/AbsoluteLayoutDemoPage.xaml#L9
Tuesday, March 10, 2015 10:57 PM -
User92610 posted
Thanks @MikeEEE, referencing like that fixed it. So 1.4.0 introduced a bug where if you define a converter in your xaml resource dictionary, and then reference it below (in my case a viewcell datatemplate). It can't find the converter.
Filed here: https://bugzilla.xamarin.com/show_bug.cgi?id=27863
<ResourceDictionary> <converters:DOBLabelConverter x:Key="DOBLabelConverter"/> <DataTemplate x:Key="listDataTemplate"> <ViewCell> <ViewCell.View> <AbsoluteLayout Padding="5, 5, 5, 5"> <Label Text="{Binding Name}" AbsoluteLayout.LayoutBounds="42,0,1,25" AbsoluteLayout.LayoutFlags="WidthProportional"/> <RelativeLayout AbsoluteLayout.LayoutBounds="42,25,1,25" AbsoluteLayout.LayoutFlags="WidthProportional"> <Label Text="{Binding DateOfBirth, Converter={StaticResource converters:DOBLabelConverter}}" LineBreakMode="TailTruncation" RelativeLayout.XConstraint="{ConstraintExpression Type=Constant, Constant=0}" RelativeLayout.YConstraint="{ConstraintExpression Type=Constant, Constant=5}"/>
System.Exception: Position 35:36. StaticResource not found for key DOBLabelConverter at Xamarin.Forms.Xaml.StaticResourceExtension.ProvideValue (IServiceProvider serviceProvider) [0x00000] in
:0 at Xamarin.Forms.Xaml.ApplyPropertiesVisitor.Visit (Xamarin.Forms.Xaml.ElementNode node, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.RootNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.XamlLoader.Load (Xamarin.Forms.BindableObject view, System.String xaml) [0x00000] in :0 at Xamarin.Forms.Xaml.XamlLoader.Load (Xamarin.Forms.BindableObject view, System.Type callingType) [0x00000] in :0 at Xamarin.Forms.Xaml.Extensions.LoadFromXaml[ComposeMessagePage] (Company.Mobile.Pages.ComposeMessagePage view, System.Type callingType) [0x00000] in :0 at Company.Mobile.Pages.ComposeMessagePage.InitializeComponent () [0x0000c] in /Users/shane/GitHub/Company.Mobile/Company.Mobile/obj/Debug/ComposeMessagePage.xaml.g.cs:44 [clipped] Wednesday, March 11, 2015 2:33 AM -
User81048 posted
BindingContext of Footer in Listview is null from xaml:
<ListView ...> <ListView.Footer> <Label Text="Loading..." IsVisible="{Binding IsLoading}" /> </ListView.Footer> </ListView>
Does not work, because BindingContext in the label is null (but the page has one). Is this a bug and is there a way in xaml to set it to the parent's view? Like BindingContext="{Binding ParentView.BindingContext}" (does not work) - without using code-behind file
Wednesday, March 11, 2015 11:32 AM -
User6349 posted
@ShanePope: Weird, that's good to know. That should still resolve since it's in the logical hierarchy. Is this code somewhere where I could try to help verify and possibly submit a bug if so?
Wednesday, March 11, 2015 11:45 AM -
User92610 posted
@MikeEEE I tried to write a sample app to reproduce it that I could share but it didn't crash. Definitely was a 1.4.0 regression but I can't spend more time looking into why right now. Thanks again for the workaround.
Wednesday, March 11, 2015 4:59 PM -
User81048 posted
Even worse, in the above code, if I set the BindingContext in the code-behind file, the footer does not get resized when IsVisible of the label changes (Android). The place/height of the label is always there at the end of the list. So how is this supposed to be used? Is this only a "static" footer which should not be changed after initialized? Tried to set footer after the loading operation to null, but for that I get an exception:
[MonoDroid] UNHANDLED EXCEPTION: [MonoDroid] System.NullReferenceException: Object reference not set to an instance of an object [MonoDroid] at Xamarin.Forms.Platform.Android.ListViewRenderer/Container.OnMeasure (int,int)
[MonoDroid] at Android.Views.View.nOnMeasureII (intptr,intptr,int,int) [0x00009] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.21-series/49a04b96/source/monodroid/src/Mono.Android/platforms/android-16/src/generated/Android.Views.View.cs:12274 [MonoDroid] at (wrapper dynamic-method) object.4f5eb468-bce0-4fbe-8865-c7a37e82f01b (intptr,intptr,int,int) Wednesday, March 11, 2015 7:37 PM -
User85984 posted
@TheRealJasonSmith .. I have a page with a lot of fields (and therefore requiring a scrollview) where all fields are disabled .. then on WP you cannot scroll. It Works fine on both Android an iPhone.
And this used to work fine in previous version of XF.
Is that a known issue?
Also .. I'm still not able to disable an Editor control on iOS. Yes .. in a ScrollView. :-)
/per
Monday, March 16, 2015 8:57 AM -
User84378 posted
Not sure if it's something within my project by I'm trying to use ListView's ScrollTo to scroll to the top of the list and any attempts I had at getting it working failed.
This is the exception I get: "Argument is out of a range.\n Parameter name: index"
Stack trace: 0x21 in System.Diagnostics.Debugger.MonoUnhandledExceptioninternal C# 0x1 in System.Diagnostics.Debugger.MonoUnhandledException C# 0x3E in object.6dde6d35-951e-47b4-b4fb-d994267d69e1 C# 0x15 in Xamarin.Forms.ListProxy.getItem C# 0x9 in Xamarin.Forms.TemplatedItemsList
,Xamarin.Forms.Cell>.getItem C# 0xB1 in Xamarin.Forms.Platform.Android.ListViewRenderer.OnScrollToRequested C# 0x1D in Xamarin.Forms.Platform.Android.ListViewRenderer.OnLayout C# 0x12 in Xamarin.Forms.Platform.Android.FormsViewGroup.nOnLayout_ZIIII C# Current code:
Device.BeginInvokeOnMainThread(() => { try { list.ScrollTo(null, ScrollToPosition.Start, false); } catch { } });
Called from OnAppearing ...
Please note I've also tried by passing the first item with same result. Anywaym, I would expect ScrollTo position to work without passing an item if one wants to scroll to beginning of list.
Tuesday, March 17, 2015 8:33 AM -
User428 posted
@MihaiCvasnievschi
I am not sure if it is the same issue but I was getting a similar exception to what you noted: "Argument is out of a range.\n Parameter name: index" when I had bound a generic List
to the ListView instead of an ObservableCollection . I would get the exception when I tried the new Pull-To-Refresh feature built into the ListView. I fixed it by using an ObservableCollection instead of a List. Dan
Tuesday, March 17, 2015 10:58 PM -
User97927 posted
Does anyone have a sample for a listview with footer. I don't know how to set the footer
I made a few test and in this way it doesn't work
var listView = new ListView { Footer = new TextCell { Text = "Halt" }, FooterTemplate = new DataTemplate(typeof(TextCell)) };
Wednesday, March 18, 2015 7:52 AM -
User51906 posted
@TheRealJasonSmith
I've already written in a thread for a new bug. Take a look at this: http://forums.xamarin.com/discussion/35906/tabbedpage-nullpointerexception I filled in a new bug here with an example app here: https://bugzilla.xamarin.com/show_bug.cgi?id=28191Thursday, March 19, 2015 12:04 PM -
User75163 posted
@TheRealJasonSmith I am using the latest stable versions. I have a listview that opens another page whenever a list item is tapped. I am getting the error below. Sometimes it happens immediately on the first item tap, other times I would have to tap a few items before I get the error. It causes the app to crash.
03-19 12:28:56.708 E/mono-rt (23728): [ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentException: 'jobject' must not be IntPtr.Zero. 03-19 12:28:56.708 E/mono-rt (23728): Parameter name: jobject 03-19 12:28:56.708 E/mono-rt (23728): at Android.Runtime.JNIEnv.CallIntMethod (IntPtr jobject, IntPtr jmethod) [0x00010] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.21-series/9e05e39f/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:343 03-19 12:28:56.708 E/mono-rt (23728): at Android.Widget.AdapterView.get_FirstVisiblePosition () [0x00043] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.21-series/9e05e39f/source/monodroid/src/Mono.Android/platforms/android-21/src/generated/Android.Widget.AdapterView.cs:890 03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, SetValueFlags attributes, SetValuePrivateFl03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.Platform.Android.ListViewAdapter.SelectItem (System.Object item) [0x00000] in <filename unknown>:0 03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.Platform.Android.ListViewAdapter.OnItemSelected (System.Object sender, Xamarin.Forms.SelectedItemChangedEventArgs eventArg) [0x00000] in <filename unknown>:0 03-19 12:28:56.708 E/mono-rt (23728): at (wrapper delegate-invoke) System.EventHandler`1<Xamarin.Forms.SelectedItemChangedEventArgs>:invoke_void_object_TEventArgs (object,Xamarin.Forms.SelectedItemChangedEventArgs) 03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.ListView.OnSelectedItemChanged (Xamarin.Forms.BindableObject bindable, System.Object oldValue, System.Object newValue) [0x00000] in <filename unknown>:0 03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty property, Xamarin.Forms.BindablePropertyContext context, System.Object value, Boolean currentlyApplying, SetValueFlags attributes, Boolean silent) [0x00000] in <filename unknown>:0 03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, SetValueFlags attributes, SetValuePrivateFlags privateAttributes) [0x00000] in <filename unknown>:0 03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, SetValueFlags attributes) [0x00000] in <filename unknown>:0 03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.ListView.NotifyRowTapped (Int32 groupIndex, Int32 inGroupIndex) [0x00000] in <filename unknown>:0 03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.ListView.NotifyRowTapped (Int32 index) [0x00000] in <filename unknown>:0 03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.Platform.Android.ListViewAdapter.HandleItemClick (Android.Widget.AdapterView parent, Android.Views.View view, Int32 position, Int64 id) [0x00000] in <filename unknown>:0 03-19 12:28:56.708 E/mono-rt (23728): at Xamarin.Forms.Platform.Android.CellAdapter.OnItemClick (Android.Widget.AdapterView parent, Android.Views.View view, Int32 position, Int64 id) [0x00000] in <filename unknown>:0 03-19 12:28:56.708 E/mono-rt (23728): at Android.Widget.AdapterView+IOnItemClickListenerInvoker.n_OnItemClick_Landroid_widget_AdapterView_Landroid_view_View_IJ (IntPtr jnienv, IntPtr native__this, IntPtr native_parent, IntPtr native_view, Int32 position, Int64 id) [0x00019] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.21-series/9e05e39f/source/monodroid/src/Mono.Android/platforms/android-21/src/generated/Android.Widget.AdapterView.cs:194 03-19 12:28:56.708 E/mono-rt (23728): at (wrapper dynamic-method) object:bc160864-7a13-4b98-9851-97d0881bda5a (intptr,intptr,intptr,intptr,int,long)
Thursday, March 19, 2015 5:06 PM -
User50706 posted
Upgrading to Xamarin Forms 1.4.0.6341 causes a Null Reference exception to be thrown in an Android Custom CellRenderer.
Steps to reproduce
- Clone https://github.com/paulpatarinski/Xamarin.Forms.Plugins/tree/Forms_1.4.0.6341/ExtendedCells
- Run the Android project.
as comparison if you checkout the master branch : https://github.com/paulpatarinski/Xamarin.Forms.Plugins/tree/master/ExtendedCells
which is running Forms 1.3.2.6316 the exception does not occur.
Stack Trace attached
Friday, March 20, 2015 2:08 AM -
User74604 posted
Hi,
I love all the new features. They make my life a lot easier. But I still miss a lot of styling options for the most basic controls. With forms I cannot style my app completely like the way I would on a native platform. I now do this with renderers but it takes up a lot of my time I would like to spend on app features instead of styling.
Friday, March 20, 2015 8:52 AM -
User77086 posted
FooterTemplate cause NullReferenceException when StackLayout is put inside it. HeaderTemplate works fine in same conditions. I started a thread about this here
Saturday, March 21, 2015 8:16 PM -
User6349 posted
This is definitely a version 1.x product @BrunoVanThournout.9700 ... if you're in it now, you're in it for the long run. :) To me, it's like going through Silverlight all over again (but on a much bigger and viable scale). There was a lot of churn with Silverlight and it really didn't start getting awesome until 4.0. 5.0 was really quite supreme and you could make a living off it (if it wasn't for those darned devices and Apple...).
I think Xamarin is more efficient than MSFT, however. :) In another year or so this tech is going to be UBER-supreme haha.
Sunday, March 22, 2015 10:28 AM -
User84378 posted
@TheRealJasonSmith - found an interesting issue on iOS.
Run the MobileCRM Sample on iOS while the Personal Hotspot has at least one connection (it would show under the iOS status bar).
Forms do not properly resize the screen to show the Tab buttons (they got cut). This only happens when starting the app, if sent to background and reactivated the UI will be correctly displayed.
Edit 1: I've tested on another app that we've developed and that uses Tabs and the issue can-not be reproduced. I think you could test this out whenever you have 5 minutes ;-) Not a show stopper!
Monday, March 23, 2015 2:45 PM -
User258 posted
Footer is not shown on iOS. Footer height is not always calculated correctly on Android.
Monday, March 23, 2015 2:47 PM -
User70005 posted
@MihaiCvasnievschi were you able to get past through your linker error.I am getting same exception with 1.3.2 version of xamarin forms.
Monday, March 23, 2015 6:54 PM -
User45033 posted
@TheRealJasonSmith I'm having the same issue @WesselOosthuizen reported earlier in the thread. I have a ListView that opens another page when clicked. This ListView occasionally (rarely, seemingly randomly) throws an error that crashes the app when clicked. This issue only happens on the Android build.
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x00028> at Android.Runtime.JNIEnv.GetMethodID (intptr,string,string) <0x000bf> at Android.Views.View.SetBackgroundResource (int) <0x0016b> at Xamarin.Forms.Platform.Android.CellAdapter.UnsetSelectedBackground (Android.Views.View) <0x00027> at Xamarin.Forms.Platform.Android.ListViewAdapter.Select (int,Android.Views.View) <0x00033> at Xamarin.Forms.Platform.Android.ListViewAdapter.SelectItem (object) <0x0009b> at Xamarin.Forms.Platform.Android.ListViewAdapter.OnItemSelected (object,Xamarin.Forms.SelectedItemChangedEventArgs) <0x0003b> at Xamarin.Forms.ListView.OnSelectedItemChanged (Xamarin.Forms.BindableObject,object,object) <0x000b3> at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty,Xamarin.Forms.BindableObject/BindablePropertyContext,object,bool,Xamarin.Forms.BindableObject/SetValueFlags,bool) <0x002bf> at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty,object,Xamarin.Forms.BindableObject/SetValueFlags,Xamarin.Forms.BindableObject/SetValuePrivateFlags) <0x0052f> at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty,object,bool,bool) <0x001bf> at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty,object) <0x00033> at Xamarin.Forms.ListView.setSelectedItem (object) <0x00027> at Vintiri.ResultsPage/
cAnonStoreyC.<>m2 (object,Xamarin.Forms.ItemTappedEventArgs) <0x0012b> at Xamarin.Forms.ListView.NotifyRowTapped (int,int) <0x00153> at Xamarin.Forms.ListView.NotifyRowTapped (int) <0x0006b> at Xamarin.Forms.Platform.Android.ListViewAdapter.HandleItemClick (Android.Widget.AdapterView,Android.Views.View,int,long) <0x0007f> at Xamarin.Forms.Platform.Android.CellAdapter.OnItemClick (Android.Widget.AdapterView,Android.Views.View,int,long) <0x000eb> at Android.Widget.AdapterView/IOnItemClickListenerInvoker.n OnItemClickLandroidwidgetAdapterViewLandroidviewView_IJ (intptr,intptr,intptr,intptr,int,long) <0x000b7> at (wrapper dynamic-method) object.80fdc79f-27fb-4f57-b3ad-7a266273c360 (intptr,intptr,intptr,intptr,int,long) <0x0007b>Monday, March 23, 2015 7:16 PM -
User45033 posted
@TheRealJasonSmith I'm having the same issue @WesselOosthuizen reported earlier in the thread. I have a ListView that opens another page when clicked. This ListView occasionally (rarely, seemingly randomly) throws an error that crashes the app when clicked. This issue only happens on the Android build.
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x00028> at Android.Runtime.JNIEnv.GetMethodID (intptr,string,string) <0x000bf> at Android.Views.View.SetBackgroundResource (int) <0x0016b> at Xamarin.Forms.Platform.Android.CellAdapter.UnsetSelectedBackground (Android.Views.View) <0x00027> at Xamarin.Forms.Platform.Android.ListViewAdapter.Select (int,Android.Views.View) <0x00033> at Xamarin.Forms.Platform.Android.ListViewAdapter.SelectItem (object) <0x0009b> at Xamarin.Forms.Platform.Android.ListViewAdapter.OnItemSelected (object,Xamarin.Forms.SelectedItemChangedEventArgs) <0x0003b> at Xamarin.Forms.ListView.OnSelectedItemChanged (Xamarin.Forms.BindableObject,object,object) <0x000b3> at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty,Xamarin.Forms.BindableObject/BindablePropertyContext,object,bool,Xamarin.Forms.BindableObject/SetValueFlags,bool) <0x002bf> at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty,object,Xamarin.Forms.BindableObject/SetValueFlags,Xamarin.Forms.BindableObject/SetValuePrivateFlags) <0x0052f> at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty,object,bool,bool) <0x001bf> at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty,object) <0x00033> at Xamarin.Forms.ListView.setSelectedItem (object) <0x00027> at Vintiri.ResultsPage/
cAnonStoreyC.<>m2 (object,Xamarin.Forms.ItemTappedEventArgs) <0x0012b> at Xamarin.Forms.ListView.NotifyRowTapped (int,int) <0x00153> at Xamarin.Forms.ListView.NotifyRowTapped (int) <0x0006b> at Xamarin.Forms.Platform.Android.ListViewAdapter.HandleItemClick (Android.Widget.AdapterView,Android.Views.View,int,long) <0x0007f> at Xamarin.Forms.Platform.Android.CellAdapter.OnItemClick (Android.Widget.AdapterView,Android.Views.View,int,long) <0x000eb> at Android.Widget.AdapterView/IOnItemClickListenerInvoker.n OnItemClickLandroidwidgetAdapterViewLandroidviewView_IJ (intptr,intptr,intptr,intptr,int,long) <0x000b7> at (wrapper dynamic-method) object.80fdc79f-27fb-4f57-b3ad-7a266273c360 (intptr,intptr,intptr,intptr,int,long) <0x0007b>Monday, March 23, 2015 7:16 PM -
User350 posted
I've just upgraded to this release to get the fix for bug 25611, but seem to have hit another one on WinPhone.
If I have 52 items in a ListView, and I use the following code to scroll to the end:
private void btnGotoEnd_Clicked(object sender, EventArgs e) { var model = this.BindingContext as ListViewPage2ViewModel; if (model != null) { var scrollToItem = model.People[model.People.Count - 1]; lstPeople.ScrollTo(scrollToItem, ScrollToPosition.Start, false); } }
This works fine on Android and iOS, but on WinPhone it only scrolls part way down the list- down to the 42nd item.
I can't see this raised as a bug already.
Tuesday, March 24, 2015 10:51 PM -
User59421 posted
Did anyone encounter listview rendering issue where it sometimes doesn't display the content in cell and if the listview content is long enough for the cell that has display issue to scroll off screen and come back...the content will then display properly?
Saturday, March 28, 2015 3:32 AM -
User65389 posted
@monkichi: Yes I also had this (on iOS), but not really to comprehend.
Saturday, March 28, 2015 7:53 AM -
User84378 posted
@TheRealJasonSmith I can confirm that ListView.ScrollTo works as long as the ListView is bind to an ObservableCollection but this degrades the performances of the initial load for long lists.
Are there any plans to allow the ListView to ScrollTo Start or End without having to provide a specific item? It's not like I want to scroll to a particular item I just want to make sure that the list is at its start.
Monday, March 30, 2015 8:54 AM -
User19530 posted
@MihaiCvasnievschi When adding too many things to the observable collection degraded performance because it triggered a ui update on each add so I just created a local observablecollection that the control wasn't subscribed to, filled it, and then assigned it to my view model instance.
ver persons = new ObservableCollection<Person>(); -- loop to add persons -- Persons = persons;
I haven't tried but you also might be able to create a custom ObservableCollection that you could delay or disable temporarily collection change events from being fired on adds.
Monday, March 30, 2015 4:24 PM -
User6753 posted
It is quite easy to extend ObservableCollection to only fire the collection changed event once while adding a list of items,
Here is a class that adds AddRange and RemoveRange that will only fire once all the items are added/removed.
public class ObservableRangeCollection<T> : ObservableCollection<T> { public void AddRange(IEnumerable<T> items) { CheckReentrancy(); foreach (var item in items) { Items.Add(item); } OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } //------------------------------------------------------------------------------------------------------------------------------------- public void RemoveRange(IEnumerable<T> items) { CheckReentrancy(); foreach (var item in items.Where(Contains)) { Items.Remove(item); } OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } }
Monday, March 30, 2015 7:12 PM -
User84378 posted
@EricHamrick my observable collection is generated on a different thread from an IEnumerable - so normally the first load of the screen shouldn't take that much time.
Yet a lot of time is lost within the list it self rendering the content.
When I have the list bound directly to the IEnumerable things are a bit faster. I think that's because of how the ListRenderer handles the load (maybe the adapter?). Anyway, if you guys have access to Xamarin University you'll see in the Performance training that they do recommend using IEnumerable to speed up rendering times of long ListView - naturally I would have expected for the Xamarin.Forms equivalent to work like charm with the IEnumerable but its not the case.
Tuesday, March 31, 2015 6:01 AM -
User19530 posted
@MihaiCvasnievschi It should take a lot of time initially if you you are filling an observable collection the control is bound to with a lot of items very quickly after the control has been fully initialized. When you set the itemssource property of control to an empty observable collection at initialization at some point it will probably subscribe to the event defined in INotifyCollectionChanged that every observable collection implements. Every time you add an item to a normal observable collection it fires off an event that the control is listening so the control can handle the update. A single update is an an expensive process and doing many updates sequentially is something that you want to keep to a minimum. It shouldn't matter on what thread you do it on. It will probably all get pushed into the ui thread at some point in the control.
When you bind to any nonobservable collection there are no collection change events fired when you add items.
As for the issue with the control not working with an IEnumerable at all thats an issue that is probably only addressable by the Xamarin Forms team. My suggestion and Marks code above is just a way to continue to use an observable collection without an enormous about of a events being fired and handled by the control everytime you loop over the collection and add things quickly.
Tuesday, March 31, 2015 11:45 PM -
User84378 posted
@EricHamrick - in my case the observable collection is not generated by "adding" items to it. Initially the ItemSource is null - the collection gets created (constructed) on a different thread from a IEnumerable (via LINQ). So normally this should not affect the performance of the initial load of the list. But, after the collection is completed by the background thread the ListView will notice that there are new a batch of new items and it's doing it best to render as many as possible - obviously with a performance cost.
After the initial load I'm only adding an item to the list from time to time (caused by an user action) - that's why I wanted the ListView to be scrolled on top in the first place.
Again, the problem is not after the IEnumerable or ObservableCollection list was iterated by the ListView - it is the initial load that's causing issue. (Actually now with 1.4.1 things run smoother - so I could say it used to cause issues)
Wednesday, April 1, 2015 7:23 AM -
User125363 posted
I have what appears to be valid XAML to enable the pull-to-refresh functionality (testing on iOS)
<ScrollView> <ListView ItemsSource="{Binding InstagramMessages}" SelectedItem="{Binding SelectedMessage}" RefreshCommand="{Binding RefreshCommand}" IsPullToRefreshEnabled="true">
But the compiler seems to think otherwise, apparently 'RefreshCommand' isn't a valid property, even though Xamarin Studio auto completes it for me.
I wondered whether the View Model command was invalid, but it appears okay to me (public ICommand and instance exists)...
public ICommand RefreshCommand; ... // In constructor... this.RefreshCommand = new Command(LoadMessages); ... public async void LoadMessages() { ... }
Here's the inner exception...
Position 16:4. No Property of name RefreshCommand found (Xamarin.Forms.Xaml.XamlParseException) at Xamarin.Forms.Xaml.ApplyPropertiesVisitor.SetPropertyValue (System.Object xamlelement, XmlName propertyName, System.Object value, Xamarin.Forms.BindableObject rootElement, INode node, Xamarin.Forms.Xaml.HydratationContext context, IXmlLineInfo lineInfo) [0x00540] in
:0 at Xamarin.Forms.Xaml.ApplyPropertiesVisitor.Visit (Xamarin.Forms.Xaml.ValueNode node, INode parentNode) [0x0004f] in :0 at Xamarin.Forms.Xaml.ValueNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00000] in :0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00030] in :0 at Xamarin.Forms.Xaml.ElementNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00067] in :0 at Xamarin.Forms.Xaml.RootNode.Accept (IXamlNodeVisitor visitor, INode parentNode) [0x00030] in :0 at Xamarin.Forms.Xaml.XamlLoader.Load (Xamarin.Forms.BindableObject view, System.String xaml) [0x000be] in :0 at Xamarin.Forms.Xaml.XamlLoader.Load (Xamarin.Forms.BindableObject view, System.Type callingType) [0x0002b] in :0 at Xamarin.Forms.Xaml.Extensions.LoadFromXaml[TView] (Xamarin.Forms.Xaml.TView view, System.Type callingType) [0x00000] in :0 at nativeapp.InstagramPage.InitializeComponent () [0x0000c] in /Users/Rob/Documents/Devology/social-scheduler/trunk/Source/nativeapp/obj/Debug/nativeapp.Views.InstagramPage.xaml.g.cs:21 at nativeapp.InstagramPage.getBindingContext () [0x00032] in /Users/Rob/Documents/Devology/social-scheduler/trunk/Source/nativeapp/Views/InstagramPage.xaml.cs:25 at (wrapper managed-to-native) System.Reflection.MonoCMethod:InternalInvoke (System.Reflection.MonoCMethod,object,object[],System.Exception&) at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) [0x00002] in /Users/builder/data/lanes/2966/58ba2bc3/source/maccore/build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:644 I am using version 5.10.3 build 26 stable.
Tuesday, March 8, 2016 7:16 PM -
User125363 posted
But the compiler seems to think otherwise, apparently 'RefreshCommand' isn't a valid property, even though Xamarin Studio auto completes it for me.
Okay - silly me, I didn't realise that I needed to manually update the Xamarin.Forms Nuget packages after upgrading Xamarin Studio components earlier. It now runs okay, but I don't see the pull-to-refresh functionality as expected; I'll raise this under a new forum entry.
Tuesday, March 8, 2016 7:36 PM