首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用.net、MAUI或Xamarin窗体中的复杂对象进行Shell导航?

如何使用.net、MAUI或Xamarin窗体中的复杂对象进行Shell导航?
EN

Stack Overflow用户
提问于 2022-05-08 09:33:52
回答 1查看 1.1K关注 0票数 3

最近,我开始使用shell,我注意到页面转换方面的改进,我使用NavigationPage时遇到的一个bug是通过用shell替换它来修复的。

所以我很兴奋能用它。

然而,在我意识到我不能像使用页面的构造器那样从一个页面发送到另一个页面之后,我就不能通过shell发送对象。我搜索了一下,现在知道shell只传递字符串。我将对象转换为JSON,但由于URI长度较长,因此遇到了异常。

老实说我很失望。我以为这样重要的东西会在shell中实现.但无论如何,你们是怎么处理这件事的?

EN

回答 1

Stack Overflow用户

发布于 2022-05-08 20:07:42

Maui

(Xamarin)使用一种方法处理导航数据

毛伊岛问题中也提到了。在那里修改Maui调用:

代码语言:javascript
复制
await Shell.Current.GoToAsync("//myAwesomeUri",
    new Dictionary { {"data", new MyData(...)} });

这使用IQueryAttributableApplyQueryAttributes传递IDictionary<string, object> query

( Xamarin示例显示IDictionary<string, string>,但它的, object在Maui中,因此可以传递任何对象值。)

因此,您传递的字符串参数可以用于查找相应的对象。

从(Xamarin) doc (修改以显示查找对象):

代码语言:javascript
复制
public class MonkeyDetailViewModel : IQueryAttributable, ...
{
    public MyData Data { get; private set; }

    public void ApplyQueryAttributes(IDictionary<string, object> query)
    {
        Data = (MyData)query["data"];
    }
    ...
}

对于Xamarin Forms,对字符串值的限制使其变得有点难看。一种方法是拥有一个包含可能的对象的static,您可以使用字符串查找这些对象。当对象都是预先定义的时,这是可以容忍的,但如果手动更改这些对象,则会有些笨拙。

代码语言:javascript
复制
public class MonkeyDetailViewModel : IQueryAttributable, ...
{
    public static Dictionary<string, MyData> KeyedData;

    // "static": One-time class constructor.
    public static MonkeyDetailViewModel()
    {
        KeyedData = new Dictionary<string, MyData>();
        KeyedData["data1"] = new MyData(...);
        // ... other versions of the data ...
    }


    public MyData Data { get; private set; }

    public void ApplyQueryAttributes(IDictionary<string, string> query)
    {
        string whichData = query["data"];   // In example, gets "data1".
        Data = KeyedData[whichData];
    }
    ...
}

用法:

代码语言:javascript
复制
await Shell.Current.GoToAsync("//myAwesomeUri",
    new Dictionary { {"data", "data1"} });

注意:静态字典使维护MyData的多个实例成为可能。"hack“的替代方法是让MyData Data be static,并在GoToAsync之前显式地设置它--但是如果您曾经在nav堆栈上有一个MonkeyDetailView,转到第二个MonkeyDetailView,然后返回到第一个MonkeyDetailView,那么这是很危险的--您将覆盖第一个视图所看到的Data

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72159711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档