愿你出走半生,归来仍是少年!
环境:.NET 7
基于基础的Popup对象实现的依附于某个控件的弹窗,弹窗可呈现数组对象,达到较好的选择交互效果。
1.布局
通过Border实现圆角边框轮廓,然后通过内部的ListView实现列表展示。
<?xml version="1.0" encoding="utf-8" ?>
<toolkit:Popup xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiLib.Utility.Controls.Popups.AttachListPopup"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Name="popup"
Color="Transparent"
>
<VerticalStackLayout x:Name="outLyt" BackgroundColor="Transparent">
<Border BackgroundColor="White" StrokeThickness="0" StrokeShape="RoundRectangle 10,10,10,10" HorizontalOptions="Center">
<VerticalStackLayout >
<ListView x:Name="lv" ItemSelected="lv_ItemSelected" VerticalScrollBarVisibility="Never">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding}" TextColor="Black" >
</TextCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</VerticalStackLayout>
</Border>
</VerticalStackLayout>
</toolkit:Popup>
2.代码
通过传入要依附的控件对象以及需要进行选择的文本集合,可实现弹窗的构建。在选择后通过CloseAsync方法返回选择的数据序号。
/// <summary>
/// 依附列表popup
/// </summary>
public partial class AttachListPopup : CommunityToolkit.Maui.Views.Popup
{
/// <summary>
///
/// </summary>
/// <param name="items">选项</param>
/// <param name="anchorView">依附的控件</param>
/// <param name="marginLeft">左侧间隔</param>
/// <param name="marginBottom">底部间隔</param>
/// <param name="width">宽度</param>
public AttachListPopup(List<string> items ,View anchorView,double marginLeft,double marginBottom,double width=140)
{
InitializeComponent();
lv.ItemsSource = items;
this.Anchor=anchorView;
outLyt.Padding = new Thickness(anchorView.Width+ marginLeft, 0, 0, marginBottom);
outLyt.WidthRequest = anchorView.Width +marginLeft+ width;
}
private async void lv_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
await CloseAsync(e.SelectedItemIndex);
}
}
3.使用
var allBTiles = smv.BasicTiles.Select(p => p.Last().DisplayName).ToList();
var popup = new AttachListPopup(allBTiles, sender as Button, 12, 20);
var result = await this.ShowPopupAsync(popup);
if (result != null)
{
await smv.ChangedBasicTile((int)result);
await Toast.Make($"底图已切换为{allBTiles[(int)result]}").Show();
}
4.效果
此处展示是基于Android平台,实现点击功能按钮后展示弹窗并选择信息给出反馈。