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事件