Interaction.Behaviors does not work in SplitView? - winrt-xaml

I use SplitView for my XAML page. Inside the SplitView, trigger behavior doesn't work.
For example:
<SplitView.Content>
<Grid>
<Button x:Name="Button">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="Click" >
<Core:GoToStateAction StateName="SplitViewState />
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</Button>
</Grid>
</SplitView.Content>
When clicking the button, nothing happens. It works on elements outside the SplitView.

I guess you missed setup TargetObject value.
<Button Content="click me"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<I:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="Click" >
<Core:GoToStateAction TargetObject="{Binding ElementName=MySplitView}"
StateName="OpenOverlayLeft"/>
</Core:EventTriggerBehavior>
</I:Interaction.Behaviors>
</Button>
UPDATED
Look at behavior with 4 buttons which placed inside SplitView.Content, SplitView.Pane and outside. All works very well.
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<SplitView x:Name="MySplitView"
PaneBackground="Gray"
DisplayMode="CompactOverlay"
IsPaneOpen="True"
CompactPaneLength="50"
OpenPaneLength="280">
<SplitView.Pane>
<Grid>
<Button Content="close inside"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Click" >
<core:GoToStateAction TargetObject="{Binding ElementName=MySplitView}"
StateName="Closed"/>
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
</Button>
</Grid>
</SplitView.Pane>
<SplitView.Content>
<Grid>
<Button Content="open inside"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Click">
<core:GoToStateAction TargetObject="{Binding ElementName=MySplitView}"
StateName="OpenOverlayLeft"/>
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
</Button>
</Grid>
</SplitView.Content>
</SplitView>
<Grid Grid.Column="1"
Background="Aquamarine">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Content="open outside"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Click">
<core:GoToStateAction TargetObject="{Binding ElementName=MySplitView}"
StateName="OpenOverlayLeft"/>
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
</Button>
<Button Content="close outside"
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<i:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Click" >
<core:GoToStateAction TargetObject="{Binding ElementName=MySplitView}"
StateName="Closed"/>
</core:EventTriggerBehavior>
</i:Interaction.Behaviors>
</Button>
</Grid>
</Grid>
Look how it works:

Related

How do I align this to use available screen width?

The yellow part of the screen is wasted. And the space after the image is wasted. How do I shift everything to the left? Both image and text to the left and reduce the gap to the left of both image and text? I have tried to play around with margins but am unable to.
Many thanks
Iyer
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:app01" x:Class="app01.MainPage">
<Grid RowSpacing="0,0,0,20">
<Grid.RowDefinitions>
<RowDefinition Height="70"/>
<RowDefinition Height="40" />
<RowDefinition Height="*˙"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Image Source="activair_logo.jpg" Grid.Row="0"/>
<Label Text="Services" Grid.Row="1" TextColor="Black" FontSize="36" FontAttributes="Bold"/>
<Grid RowSpacing="10" Margin="-100,10,0,0" Grid.Row="2">
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="50" />
<RowDefinition Height="50" />
<RowDefinition Height="50" />
<RowDefinition Height="50" />
<RowDefinition Height="50" />
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" ColumnSpacing="-100">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5%" />
<ColumnDefinition Width="95%" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Column="0">
<Image Source="./aa_airfreight.jpg" HeightRequest="50"></Image>
</StackLayout>
<StackLayout Grid.Column="1" VerticalOptions="Top">
<Label Grid.Column="1" Text="Air Freight" FontSize="24" TextColor="Green" FontAttributes="Bold" />
</StackLayout>
</Grid>
<Grid Grid.Row="1" ColumnSpacing="-100">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5%" />
<ColumnDefinition Width="95%" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Column="0">
<Image Source="./aa_oceanfreight.jpg" HeightRequest="50"></Image>
</StackLayout>
<StackLayout Grid.Column="1" VerticalOptions="Top">
<Label Text="Sea Freight" FontSize="24" TextColor="Green" FontAttributes="Bold" />
</StackLayout>
</Grid>
<Grid Grid.Row="2" ColumnSpacing="-100">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5%" />
<ColumnDefinition Width="95%" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Column="0">
<Image Source="./aa_customs.jpg" HeightRequest="50"></Image>
</StackLayout>
<StackLayout Grid.Column="1" VerticalOptions="Top">
<Label Text="Customs" FontSize="24" TextColor="Green" FontAttributes="Bold" />
</StackLayout>
</Grid>
<Grid Grid.Row="3" ColumnSpacing="-100">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5%" />
<ColumnDefinition Width="95%" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Column="0">
<Image Source="./aa_transportation.jpg" HeightRequest="50"></Image>
</StackLayout>
<StackLayout Grid.Column="1" VerticalOptions="Top">
<Label Text="Transportation" FontSize="24" TextColor="Green" FontAttributes="Bold" />
</StackLayout>
</Grid>
<Grid Grid.Row="4" ColumnSpacing="-100">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5%" />
<ColumnDefinition Width="95%" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Column="0">
<Image Source="./aa_specialcargo.jpg" HeightRequest="50"></Image>
</StackLayout>
<StackLayout Grid.Column="1" VerticalOptions="Top">
<Label Text="Special Cargo" FontSize="24" TextColor="Green" FontAttributes="Bold" />
</StackLayout>
</Grid>
<Grid Grid.Row="5" ColumnSpacing="-100">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5%" />
<ColumnDefinition Width="95%" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Column="0">
<Image Source="./aa_exhibitioncargo.jpg" HeightRequest="50"></Image>
</StackLayout>
<StackLayout Grid.Column="1" VerticalOptions="Top">
<Label Text="Exhibition Cargo" FontSize="24" TextColor="Green" FontAttributes="Bold" />
</StackLayout>
</Grid>
<Grid Grid.Row="6" ColumnSpacing="-100">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5%" />
<ColumnDefinition Width="95%" />
</Grid.ColumnDefinitions>
<StackLayout Grid.Column="0" Grid.Row="0">
<Image Source="./aa_relocation.jpg" HeightRequest="50"></Image>
</StackLayout>
<StackLayout Grid.Column="1" Grid.Row="0" VerticalOptions="Center">
<Label Text="International Relocation" FontSize="24" TextColor="Green" FontAttributes="Bold" />
</StackLayout>
</Grid>
</Grid>
<Label Text="Customers" Grid.Row="3" TextColor="Black" FontSize="36" FontAttributes="Bold"/>
</Grid>
</ContentPage>
I had pasted the code earlier - not sure why it did not appear - have managed to do better by using negative margins on the grid. Is this portable across different devices? Is this the right way to do this? I have tried to read up default margins - seems to be 6 in most cases - but in this case seems to be a lot more. Seems like 70px margin as a -60px margin seems to be looking good. What is the right way of doing this so that it renders well across device and screen types and resolutions? I have got to this point.
Now I can't figure out how to get the Customers row in the main grid to keep up with the previous row which is a sub-grid within the main one. I am so super confused. I am able to set the height of the rows under the head "Services" but I don't want to as I want to show a lot of text when the user taps on any of the services. So, the height of that row will be dynamic. I'd therefore want to use Height="*" in that inside grid so that all the rows can be "collapsed" and "expanded" on touch.
How do I get the Row that contains "Customers" to keep aligned just under the Services sub-grid?
Many thanks
Set VerticalOptions="StartAndExpand" in Main Grid
<Grid RowSpacing="0,0,0,20" VerticalOptions="StartAndExpand">
<Grid.RowDefinitions>
<RowDefinition Height="70"/>
<RowDefinition Height="40" />
<RowDefinition Height="*"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>

Xamarin Left margin in iPad

I face strange behavior when I am populate list view all cells have left margin
tested Device iPad 9 in simulator , iPad 12 in simulator
here is screen of my issue
and my second list
here is my Xaml
<customRender:ExtList x:Name="listViewFlights" BackgroundColor ="{StaticResource white_color}"
ItemTapped="ListView_OnItemTapped" SeparatorColor="Gray" SeparatorVisibility="Default"
MinimumHeightRequest="40" IsPullToRefreshEnabled="True" Refreshing="ListViewFlights_Refreshing" >
<ListView.ItemTemplate>
<DataTemplate>
<customRender:CustomViewCell >
<StackLayout Spacing="0" BackgroundColor="Aqua">
<Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" x:Name="gridCell" RowSpacing="0" ColumnSpacing="0">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3.25*"></ColumnDefinition>
<ColumnDefinition Width="4*"></ColumnDefinition>
<ColumnDefinition Width="4.75*"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Text="{Binding FirstListColumn}" Style="{StaticResource GridItemStyleLabelStart_os}" Margin="10,0,0,0"/>
<StackLayout Grid.Row="0" Grid.Column="1" Padding="{Binding FlightListColumn2Padding}" VerticalOptions="Center" >
<Label Text="{Binding Dep_Dest}" Style="{StaticResource GridItemStyleLabel_os}" HorizontalTextAlignment="Start"></Label>
</StackLayout>
<Grid Grid.Row="0" Grid.Column="2" HorizontalOptions="FillAndExpand" RowSpacing="0" >
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"></ColumnDefinition>
<ColumnDefinition Width="3*"></ColumnDefinition>
<ColumnDefinition Width="5.5*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Frame Grid.Row="0" Grid.Column="0" IsVisible="{Binding IsRecalculated}" Padding="0" Margin="0,7" OutlineColor="#5C768E" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" HasShadow="False" BackgroundColor="Transparent">
<Label Text="R" Style="{StaticResource GridItemStyleLabelStart}" HorizontalOptions="CenterAndExpand" IsVisible ="{Binding IsRecalculated}" />
</Frame>
<Label Grid.Row="0" Grid.Column="1" Text="{Binding ATCCtot }" Style="{StaticResource GridItemStyleLabelStart}" TextColor="Red" HorizontalOptions="Start" />
<Label Grid.Row="0" Grid.Column="2" Text="{Binding PreparedStd}" Style="{StaticResource GridItemStyleLabelEnd_os}" HorizontalOptions="EndAndExpand" HorizontalTextAlignment="End" />
</Grid>
<BoxView x:Name="SelectedBox" Grid.Row="0" Grid.Column="3" Opacity="{Binding IsSelected}" BackgroundColor="{StaticResource sub_header}" >
<BoxView.WidthRequest>
<OnIdiom x:TypeArguments="x:Double" Tablet="5" />
</BoxView.WidthRequest>
</BoxView>
</Grid>
</StackLayout>
</customRender:CustomViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</customRender:ExtList>
my tries to fix the issue :
after long search I find soluation in xamarin site , is to make custom render to my list view but it docent work
public class CustomListViewRenderer : ListViewRenderer
{
protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.ListView> e)
{
base.OnElementChanged (e);
if (e.NewElement != null) {
var listView = Control as UITableView;
listView.CellLayoutMarginsFollowReadableWidth = false;
}
}
}
reference https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/custom-renderer/viewcell/
This is a known bug that is in the process of being fixed.

UWP - PointerExited is not fired when Grid is in Listview

I want to show a image in the listview, and the pointer is over the image, I will display the filesize/filename and a download button at the bottom of the image. And I also can open the file by tap the image.
I registered the PointerEntered and PointerExited event of the control, and tried to show or hide the filesize/filename/download button when the events get fired.
When the finger touch the image, the PointerEntered is fired. However, on touch screen(Phone, tablet), when the finger left the image, the PointerExited event is not fired. When I operate with mouse on tablet, everything is working correctly.
Here is my code snippet:
<Grid>
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="PointerEntered" >
<Core:InvokeCommandAction Command="{Binding ShowFileInfoCommand}"></Core:InvokeCommandAction>
</Core:EventTriggerBehavior>
<Core:EventTriggerBehavior EventName="PointerExited" >
<Core:InvokeCommandAction Command="{Binding HideFileInfoCommand}"></Core:InvokeCommandAction>
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
<Image Source="{Binding ThumbnailUri}" Stretch="{Binding ImageStretch}" MaxHeight="200" MaxWidth="350" Height="{Binding FileHeight}" HorizontalAlignment="Right">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="Tapped" >
<Core:InvokeCommandAction Command="{Binding ConversationRoom.OpenFileFlipViewCommand,Source={StaticResource Locator}}" CommandParameter="{Binding}"/>
</Core:EventTriggerBehavior>
<Core:EventTriggerBehavior EventName="RightTapped">
<Core:InvokeCommandAction Command="{Binding RightTappedMessageCommand}"/>
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</Image>
<Grid Background="White" Opacity="0.75" Height="50" x:Name="InfoGrid" VerticalAlignment="Bottom" Visibility="{Binding NeedShowFileInfo, Converter={StaticResource BoolToVisible}}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Margin="6,0,0,6" Text="{Binding FileName}"/>
<TextBlock Grid.Row="1" Margin="6,0,0,6" Text="{Binding FileSize}"/>
<FontIcon Grid.Row="1" Grid.Column="1" HorizontalAlignment="Right" Margin="0,0,6,6" Glyph="" FontFamily="../Assets/fontello.ttf#fontello">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="Tapped">
<Core:InvokeCommandAction Command="{Binding DownloadCommand}"/>
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</FontIcon>
</Grid>
</Grid>
And if I move the Grid out of the listview, but in a stackpanel/Grid, everything goes fine.
Can anyone help on this issue?
Thank you!

stretch TextBlocks inside a Grid in a universal App

I am having a problem in fixing 3 TextBlocks inside a Grid,in a metro App,I used this link enter link description here
but I get always a problem in stretching my TextBlocks inside the Grid
this is my code:
<ListView Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Stretch">
<ListView.ItemTemplate >
<DataTemplate>
<Grid Margin="0" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Margin="0">
<Image Grid.Column="0" Source="images/img1.png" Margin="0,5" Stretch="Fill" Width="80"/>
</Border>
<Grid Grid.Column="1" Margin="5" HorizontalAlignment="Stretch" >
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock x:Name="text1" Text="test1" Grid.Row="0" Margin="5" HorizontalAlignment="Stretch" ></TextBlock>
<TextBlock x:Name="text2" Text="test2" Grid.Row="1" HorizontalAlignment="Stretch" ></TextBlock>
<TextBlock x:Name="text3" Text="test3" Grid.Row="2" HorizontalAlignment="Stretch" ></TextBlock>
</Grid>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
so please I need your help,to fix that
thanks for help
You have to edit style of ListViewItem and set HorizontalAlignment to Stretch
<ListView>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalAlignment"
Value="Stretch" />
<Setter Property="HorizontalContentAlignment"
Value="Stretch" />
</Style>
</ListView.ItemContainerStyle>
</ListView>

Setting column width to 50% of available width in windows phone 8.1

Developing/learning about WP8.1 for the 1st time.
This question is about layout.
I have 2 buttons.
I want them at the bottom of my screen.
I want each button to take 50% of the available width of the screen.
Similar to this:
So far I have this:
And this is my markup:
<Page
x:Class="Informed.BasicPage1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Informed"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
>
<Grid x:Name="LayoutRoot">
<Grid.ChildrenTransitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</Grid.ChildrenTransitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="45"/>
</Grid.RowDefinitions>
<!-- Title Panel -->
<StackPanel Grid.Row="0" Margin="19,0,0,0" Grid.ColumnSpan="2">
<Image Name="imgHeader" Grid.Row="0" Source="Images/bannershort.jpg" Stretch="UniformToFill"/>
<TextBlock Text="Log In" Margin="0,-6.5,0,26.5" Style="{ThemeResource HeaderTextBlockStyle}" CharacterSpacing="{ThemeResource PivotHeaderItemCharacterSpacing}"/>
</StackPanel>
<StackPanel Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.ColumnSpan="2">
<TextBox Name="email" Header="Email address"/>
<PasswordBox Name="password" Header="Password"/>
<CheckBox Name="showPassword" Content="Show password"/>
<!-- Content body -->
<TextBlock Name="body" Style="{StaticResource MessageDialogContentStyle}" TextWrapping="Wrap">
<TextBlock.Text>
Enter Email Address and Password created.
</TextBlock.Text>
</TextBlock>
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="0" Margin="0,0,0,0" Grid.ColumnSpan="1">
<Button Content="hello" Grid.Column="0" FontFamily="Global User Interface" />
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="1">
<Button Content="hello2" Grid.Column="1" FontFamily="Global User Interface" />
</StackPanel>
</Grid>
</Page>
Remove those StackPanels they are not needed. When you want something to take available space use HorizontalAlignment = Stretch:
<Button Content="hello" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Stretch" FontFamily="Global User Interface" />
<Button Content="hello2" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Stretch" FontFamily="Global User Interface" />
You will also need to make your columns equal width:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
You may also think of adding Margin="20,0,10,0" (first) and Margin="10,0,20,0" (second).
There is no point in putting one control inside panel (except some rare cases). You may also modify your code and put those Buttons inside a Grid then there is no need to make the whole main Grid with two columns:
<Grid Grid.Row="2" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Content="hello" Grid.Column="0" HorizontalAlignment="Stretch" FontFamily="Global User Interface" />
<Button Content="hello2" Grid.Column="1" HorizontalAlignment="Stretch" FontFamily="Global User Interface" />
</Grid>

Resources