I have following structure in Shell View
<FlyoutItem Route="home" Title="Home">
<ShellContent ContentTemplate="{DataTemplate views:HomePage}" />
</FlyoutItem>
<FlyoutItem Route="leaverequest" Title="Leave Request">
<ShellContent ContentTemplate="{DataTemplate views:LeaveRequestView}" />
</FlyoutItem>
The items are appearing properly.
When I click on Leave Request item, the LeaveRequestView opens with a Hamburger menu in top navigation. I want the LeaveRequestView to show a back button instead.
I have tried setting Route attribute in ShellContent instead of FlyoutItem but the result is same.
Is there something to be done in the route definition above or this is a property to be set in LeaveRequestView XAML?
PS: If I navigate in code behind using Shell.Current.GoToAsync("leaverequest"), the behavior is right. I see the back button on top navigation.
Unfortunately, it can not show the back button with follow defined XAML.
<FlyoutItem Route="home" Title="Home">
<ShellContent ContentTemplate="{DataTemplate views:HomePage}" />
</FlyoutItem>
<FlyoutItem Route="leaverequest" Title="Leave Request">
<ShellContent ContentTemplate="{DataTemplate views:LeaveRequestView}" />
</FlyoutItem>
From above the route definition above, we can not make the LeaveRequestView to show a back button.
Because it's designed by Xamarin Forms Shell. If using FlyoutItem in XAML, it means the child view will be navigated by Humburger menu.
As your said, unless using Shell.Current.GoToAsync("leaverequest") to navigate, the back button will show. Meanwhile, you will see that Humburger menu not shows not.
Note :This should be the typical feature of Xamarin Forms FlyoutItem. If not need this feature, you will not need to create a Shell application.
Related
Consider the following Xamarin.Forms Shell XAML:
<TabBar>
<Tab Title="Page1" Route="page1" Icon="page1.png">
<ShellContent ContentTemplate="{DataTemplate local:Page1}" />
</Tab>
<Tab Title="Page2" Route="page2" Icon="page2.png">
<ShellContent ContentTemplate="{DataTemplate local:Page2}" />
<ShellContent Route="page2a" ContentTemplate="{DataTemplate local:Page2A}" />
</Tab>
<Tab Title="Page3" Route="page3" Icon="page3.png">
<ShellContent ContentTemplate="{DataTemplate local:Page3}" />
</Tab>
</TabBar>
This results in 3 bottom tabs. On Page 2 there are also two top tabs.
I can navigate successfully with calls like:
.GoToAsync("//page1") and .GoToAsync("//page2/page2a")
What I would like to do is have Page2A as a page that gets pushed on top of the Page2 tab. So when I call GoToAsync("//page2/page2a") the App navigates to the Page2 tab, but displays the Page2A page on top. I'd like no top tabs, but rather the Page2A NavBar would have the back button visible, and when pressed Page2A would be popped from the stack and Page2 would again be visible.
Is there any way to achieve this with Shell, perhaps by adjusting my XAML?
At the moment I'm just using the old PushAsync(..) method, but it seems a shame to not take advantage of Shell's navigation features.
When you want to push the page on the top without page tab on the top, you could use the code below.
Navigation.PushModalAsync(new NavigationPage(new ShellTabPage1_2()));
If you want the back button, you could create with ToolbarItem.
<ContentPage.ToolbarItems>
<ToolbarItem
IconImageSource="back_button.png"
Order="Primary"
Priority="0"
Clicked="ToolbarItem_Clicked"/>
</ContentPage.ToolbarItems>
<ContentPage.Content>
<StackLayout>
<Label
HorizontalOptions="CenterAndExpand"
Text="Welcome to Shell Tab Page 1-2!"
VerticalOptions="CenterAndExpand" />
</StackLayout>
</ContentPage.Content>
I could navigate to the shell page via reset the MainPage.
App.Current.MainPage = new ShellPage();
But, it could not navigate to the shell tab page.
We could navigate to the previous page in shell.
await Navigation.PopModalAsync(false);
If you want to make the back button at left, you could do that with custom renderer.
Currently on my app i am populating a list view with various results which contain a slider, if the user right swipes they have the option to delete it, when they left swipe it nothing happens. Currently the slider can be hard to use because of the swipe motion in the list view, i want to keep the delete function in but is there any way i can remove the right swipe action? My app is cross platform but i would prefer to remove this from iOS.
This is how i am adding swipe functions:
<ViewCell.ContextActions>
<MenuItem Clicked="OnDelete" CommandParameter="{Binding .}"
Text="Remove" IsDestructive="True" />
<!-- <MenuItem Clicked="OnEdit" CommandParameter="{Binding .}"
Text="EDIT" IsDestructive="false" /> -->
</ViewCell.ContextActions>
The best solution I have discovered so far is to use the IsEnabled property. The swipe action/button will still appear, but it will be greyed out.
https://learn.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/menuitem#enable-or-disable-a-menuitem-at-runtime
Please try to use SwipeView control inside Listview or CollectionView
https://learn.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/swipeview
I am trying to create an app with NativeScript with the following layout:
On top, action bar
Content Area in the center (about 80% of screen height)
Fixed menu on bottom with 4 buttons
I know that NativeScript provides a TabView, however this view puts the menu on top for the android version of the app,and doesn't allow to use images as "ItemTitle".
So (I think) this leaves me with two options :
Create 4 different pages and load them when a user taps on the menu
buttons
Create one single page and change content according to user
selection
The first approach is great because I get to separate all xml , js and css files. However navigating between pages can take some time and doesn't give ideal user experience.
The second approach probably will have a better user experience but code will be very hard to maintain.
Which option should I use? Have any of you dealt with a similar layout?
Thank you for your time!
In my app I use the TabView with partial-views in each tab-item. So for each tab-view the content is separated in their own xml,js,css files.
So why not just take this approach and combine it with your option 2?
You could create a main-view with:
ActionBar
Centered main-content for partial-views (Stack- og GridLayout)
SegmentedBar at the bottom for navigation buttons
When the user taps a button on the SegmentedBar, you change the visibility of the corresponding partial-view.
You can use any font-icons as "images" for your title in the SegmentedBar also.
UPDATE: Added examples below.
How to create and reference partial-views
In your main-view Page-element add the references to each partial view, like here:
<Page xmlns="http://schemas.nativescript.org/tns.xsd" loaded="pageLoaded"
xmlns:t1="partial-views/tab1"
xmlns:t2="partial-views/tab2"
xmlns:t3="partial-views/tab3">
Each partial view consists of a .xml, .js and perhaps a .css file. I like to place each partial view in separate folders: tab1, tab2, tab3 as an example.
The partial-view xml file would contain only the view-modules, no page-modules. So don't add any Page or ActionBar here. Example of a partial view .xml:
<GridLayout loaded="viewLoaded">
<ListView items="{{ someItemList }}">
<ListView.itemTemplate>
...
</ListView.itemTemplate>
</ListView>
</GridLayout>
How to use partial-views
Now, it's up to you how you want to use the partial-views. Here is an example on how to use them together with a TabView component. This is placed in the same page-view where you added the references from the first example.
<TabView>
<TabView.items>
<TabViewItem title="Tab 1" iconSource="res://tab1">
<TabViewItem.view>
<t1:tab1 />
</TabViewItem.view>
</TabViewItem>
<TabViewItem title="Tab 2" iconSource="res://tab2" >
<TabViewItem.view>
<t2:tab2 />
</TabViewItem.view>
</TabViewItem>
<TabViewItem title="Tab 3" iconSource="res://tab3" >
<TabViewItem.view>
<t3:tab3 />
</TabViewItem.view>
</TabViewItem>
</TabView.items>
</TabView>
Or, you could do it without the TabView, and create something custom:
<StackLayout>
<t1:tab1 id="tab1" visibility="visible" />
<t2:tab2 id="tab2" visibility="collapsed" />
<t3:tab3 id="tab3" visibility="collapsed" />
</StackLayout>
<SegmentedBar selectedIndex="0" selectedIndexChanged="segBarSelected">
<SegmentedBar.items>
<SegmentedBarItem title="Tab 1" />
<SegmentedBarItem title="Tab 2" />
<SegmentedBarItem title="Tab 3" />
</SegmentedBar.items>
</SegmentedBar>
So here would selectedIndexChangedcontrol the visibility of each partial view.
I'm using NetOffice developing an MS Outlook AddIn, and I want to add a custom context menu item in the calendar, to allow users add a new custom appointment for the selected time range.
So as written in this article I define my additional item in the RibbonUI.xml following way:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoadRibonUI">
<ribbon>
<tabs>
<tab idMso="TabAppointment">
<group id="Group0" label="Addin" insertBeforeMso="GroupShow">
<button id="convertButton" label="Convert" getImage="ConvertImage" size="large" onAction="ConvertButton_Click" />
</group>
</tab>
<tab idMso="TabCalendar">
<group id="Group1" label="Addin" insertBeforeMso="GroupGoto">
<button id="aboutButton" label="New Custom Meeting" getImage="GetNewImage" size="large" onAction="NewMeetingButton_Click" />
<dialogBoxLauncher>
<button id="settingsButton" screentip="Addin Settings" onAction="SettingsButton_Click"/>
</dialogBoxLauncher>
</group>
</tab>
</tabs>
</ribbon>
<contextMenus>
<contextMenu idMso="ContextMenuCalendarView">
<button id="MyContextMenuCalendarView"
label="ContextMenuCalendarView"
onAction="OnMyButtonClick"/>
</contextMenu>
</contextMenus>
</customUI>
But as soon as I add the <contextMenus> node, the xml isn't working anymore, not the add in doesn't add any context menu, but it also doesn't add any buttons anymore - whereas the buttons are added when the <contextMenus> node is not defined.
Any tips how to debug this issue?
EDIT:
thanks to the tip from Dmitry I found the issue the xmlns namespace was an old one, so instead of:
xmlns="http://schemas.microsoft.com/office/2006/01/customui"
it should be:
xmlns="http://schemas.microsoft.com/office/2009/07/customui"
I can't see anything wrong off the top of my head, but enable the dev mode in Outlook - this way Outlook will report all problems in your XML. Click File | Options | Advanced | Developers | Show add-in user interface errors.
I am updating dhtmlx from v3.5 to v4.1.3 and loading tabbar from ajax call and each tabbar is having different href urls. Previously only selected tab gets load(hitting the url) while doing tabbar.loadStruct but in v4.1.3 all the href urls of tabbar are gets hitting at once while loading tabbar.loadStruct.
Following is the my tabbar xml
<tabbar hrefmode="ajax-html">
<row>
<tab id="151" width='100px' height='17px' selected="1" href="/domain/url1.action">Quick View</tab>
<tab id="198" width='100px' height='17px' href="/domain/url2.action">Chart Status</tab>
<tab id="159" width='100px' height='17px' href="/domain/url3.action">Blackline</tab>
</row>
</tabbar>
only selected first url(i.e /domain/url1.action) gets invoked first time in previous version, but in v4.1.3 all the tabbar's url gets invoked immediate after tabbar.loadStruct.
Can some help me to load only selected tabbar's url?
Here is an official tutorial that should help you: http://www.dhtmlx.com/blog/loading-content-into-tabs-on-demand/