什么XAML设计策略主/详细查看LOB应用程序

时间:2016-06-18 16:22:19

标签: xaml uwp uwp-xaml template10

我想向用户显示一个包含销售订单行的网格。在此网格中,用户可以在每条线路上输入金额。按下“保存”按钮时,将处理所有修改的行。

+---+------------+---------+---------+--------+------------------+
| # | PartNumber | Ordered | Shipped | Descr. | Quantity to ship |
+---+------------+---------+---------+--------+------------------+
| 1 | A12356     | 10      | 5       | Wheel  | [ input field ]  |
+---+------------+---------+---------+--------+------------------+
| 2 | B54556     | 10      | 0       | Frame  | [ input field ]  |
+---+------------+---------+---------+--------+------------------+
                                                  [PROCESS BUTTON]

因此,我们的想法是,用户可以一次性输入多行的发货金额,然后点击流程

到目前为止一切顺利。

我想要实现的是,用户可以单击此网格中的单元格。

  • 单击PartNumber:将打开包含部件详细信息的通用内容元素
  • 点击ShippedQty:将使用以前的货件打开通用内容元素。

我想在整个应用程序中重用这些通用内容元素。

(有许多不同的表,用户可以在其中单击PartNumber)

在查看PartNumber的详细信息时,已修改的输入字段,滚动位置等必须在主视图中保持不变(上面的表格)。

我的问题:

适合的设计策略是什么? 在WinForm中,我只需打开一个包含详细信息的新对话框。这似乎不适合UWP。

到目前为止,我想到了以下替代方案:

  • SplitView ,包含两个窗格:(1:Master)一个销售订单行页面和(2:详细信息)一个详细信息页面,其中(重新)设置内容取决于用户在哪一列点击次数。

    • Pro :可以在详细信息视图中使用Frame.Navigate()。
  • ContentPresenter ,根据用户是否点击PartNumber或Shipped Qty等来重新设置内容

  • 详情
  • ContentDialog或ModalDialog

    • 这似乎不是ContentDialog的使用方式。任何时候都只能打开一个ContentDialog,默认情况下,ContentDialog会根据其中的UI元素动态调整大小。
  • 我有什么选择吗?

1 个答案:

答案 0 :(得分:2)

"这似乎不适合UWP。"

我不明白为什么不会这样。您有很多选项,因此它更多地关于您希望UI流动的方式,而不是您正在使用的框架。我的经验是WPF ...使用适用。 如上所述,它实际上取决于您希望UI的外观以及您希望将多少工作放入其中。 在我的情况下,我希望我的组件(部件详细信息屏幕,以前的发货屏幕)完全独立于主机页面,并且不会干扰导航。使用模态对话窗口对我来说是一个不错的选择(但肯定不是唯一的选择)。

在我的应用程序中,我添加了一个名为Components的类库,它是表示层的一部分。我创建的组件我称之为选择器(CustomerSelector,PartSelector,OrderSelector ......),可以在我的应用程序中使用。选择器基本上是以模态状态打开的窗口。它显示搜索网格并将选择器上的属性设置为对象或对象集合,如果用户取消则为null。

    // this handles a button click event
    public async void SelectSeriesCommandHandler(object sender, ExecutedRoutedEventArgs e)
    {
        SeriesSelector selector = new SeriesSelector(true, WatchListSeries);  
        bool? result = selector.ShowDialog(); // grid with search options is displayed in modal dialog window

        if (result.HasValue && result.Value)
        {
            var series = selector.SelectedSeries; // use selected objects
        }
    }