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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM