Xamarin.Forms之探索笔记

1.透明

前面听过过Forms中Page是无法设置为Transparent的,这回想设置一个全透明的全页面的View(在RelativeLayout),也遇到了奇怪的问题,

假设RelativeLayout为container,里面有个StackLayout为content,将container放在一个RelativeLayout为root中,设置contaner的大小为Fill,现在设置content的x y width height为container的0.1 0.1 0.8 0.8,结果是content的大小如预期,就像一个Dialog,但是点击边缘的透明处,直接响应到下一级了,也就是root那一级了

2.Binding过程中转化失败的问题

现在有一个需求,ViewA和ViewB,DataA和DataB,ViewA绑定的是DataA,ViewB绑定的是DataB,在同一个布局文件上,需要对ViewA和ViewB之间不断的替换,并且此过程中更改BindingContext,整个操作是在异步线程中,由于View的替换需要在主线程,此时View的替换与Data的替换位置会不确定,当ViewA已经切换到ViewB,此时的BindingContext已经为DataA,就可能会出现转换失败的问题(依情况而言,如果ViewA和ViewB里面的绑定只是一级属性的绑定,不会出现任何问题,只是在Log界面出现未找到属性的提示,如果有二级属性,譬如DataA.Temp.MM这种,就会出现上述转换失败的问题)

解决方法:尽可能将BindingContext的对象整成同一类对象

3.View的Visible与界面更新

今天终于解决了用户注销后再登录,显示为空的问题

前面一直是以为NameAlias和PartOfName的更新通知的问题,让我都怀疑Binding这东西是不是学习的不够深入

后面找到上面的两个Label的容器StackLayout,IsVisible有一个绑定属性,最终发现登录的时候,我是先对NameAlias和PartOfName赋值,然后再设置IsVisible为true

结论:Forms中的IsVisible属性不像WPF中还有折叠选项,它就是原理貌似就像移除一样,不占用任何的空间,此时在Visible=false的情况下对界面更新是无效的,即时更新后设置Visible=true,前面的更新依旧无效

4.Grid误区

以前都是直接是固定大小,第一次遇见这种情况

<Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="80" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="auto" />
    </Grid.ColumnDefinitions>

最后一列的的大小会根据所有行中最后一列最大(设为 MaxWidth)的来显示,其余的如果小于最大的一个,其相当于在一个MaxWidth的宽度的容器中放入该控件

5.IsEnable

如果是Button的TextColor设为蓝色,当被禁用的时候,颜色依旧会变成灰色

6.ObserableCollection需不需要NotifyPropertyChanged

ObserableCollection是封装的ICollection,里面元素数量发生改变的时候会发出通知(CollectionChanged),但是要引起界面的改变还是需要下面的语句

private ObservableCollection<T> _dataList;
        public ObservableCollection<T> DataList
        {
            get { return _dataList;}
            set { SetProperty(ref _dataList, value);}
        }

7.Searcher如果为空的时候,点击'搜索'按键,不会触发Command事件

8.Margin

在Forms 2.2中,终于引入了Margin属性,现在设置空白终于不用外面套个StackLayout然后设置Padding了

在实际的应用中,发现Margin与Html中得有些不一样(Wpf没试过),在html中,如果两个元素之间同时设置Margin,最终的间隔是取两个的最大值,但是Forms中的是取两者之和,目前不知道是bug还是本身就是这样设计的

9.OnBackButtonPressed

Forms中其实有很多位置只是面向单个平台的,Page中的OnBackButtonPressed只对Android有效,因为iOS是没有触控键的,该方法只针对点击虚拟按键的返回键,左上角的返回是不会触发的

在MasterDetailPage中,会首先出发MainPage的该方法然后才是DetailPage的该方法

在Rg.Plugins.Popup中,有Dialog弹出的时候,是不会触发Page的该方法的,但是会触发MainActivity的OnBackPressed,Popup可以在PopupPage中的OnBackButtonPressed方法来控制

10.Converter不触发的问题

Forms版本:2.3.2

碰到一个很奇怪的问题,这样的写法居然后面的Converter没有效果,不知道是不是我的知识有误

Text="{Binding ,Converter={StaticResource xxConverter}}"

但是下面的两种写法是没问题的

Text="{Binding .,Converter={StaticResource xxConverter}}"
Text="{Binding Converter={StaticResource xxConverter}}"

11.TableSection的按压效果

<TableSection>
                    <ViewCell>
                    <behavior:Interaction.Behaviors>
                            <behavior:BehaviorCollection>
                                    <behavior:EventToCommand EventName="Tapped" Command="{Binding MenuClickCommand}" CommandParameter="0"/>
                            </behavior:BehaviorCollection>
                    </behavior:Interaction.Behaviors>
                    <StackLayout Orientation="Horizontal">
                        <iconize:IconLabel Text="fa-user" TextColor="{StaticResource Color_Blue}" VerticalOptions="Center" Margin="5,0,0,0"/>
                        <Label Text="角色列表" VerticalOptions="Center"/>
                        <!--<StackLayout.GestureRecognizers>
                            <TapGestureRecognizer Command="{Binding MenuClickCommand}" CommandParameter="0" />
                        </StackLayout.GestureRecognizers>-->
                    </StackLayout>
                    </ViewCell>
<TableSection>

上面的代码,如果使用StackLayout的点击事件来控制点击,会出现单击的过程中,没有按压效果(长按的效果不影响),说明

TapGestureRecognizer是会影响按压效果的,最好还是使用Cell自带的Tapped事件
原文地址:https://www.cnblogs.com/yz1311/p/5325427.html