【问题标题】:How can I use DesignData to help develop a Metro app?如何使用 DesignData 帮助开发 Metro 应用程序?
【发布时间】:2012-07-24 20:00:51
【问题描述】:

我一直在 Windows Phone 应用程序中愉快地使用 DesignData,我希望用它来帮助在 VS2012/Blend for VS 中可视化 Metro 风格应用程序中的设计。

我已经尝试了希望显而易见的方法:

<common:LayoutAwarePage
x:Name="pageRoot"
x:Class="MyRootNamespace.Views.EventView"
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
IsTabStop="false"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyRootNamespace.Views"
xmlns:common="using:MyRootNamespace.Common"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:bm="using:Bing.Maps"
d:DataContext="{d:DesignData Source=../SampleData/SpecialEventSampleData.xaml}"
mc:Ignorable="d">

SpecialEventSampleData.xaml 看起来大致如下:

<local:SpecialEvent 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"       
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyRootNamespace.ViewModels" 
EventName="Foo Fighters" 
Description="This exclusive April Fools Gig will see Dave Grohl and the rest of the Foo Fighters rock out at this exclusive made up gig" 
VenueName="Village Hall" 
/>

它所引用的类有一个公共的、无参数的构造函数,但是 Visual Studio 给出了一个错误:

错误无法创建“SpecialEvent”的实例。 C:...\MyRootNamespace.Windows\SampleData\SpecialEventSampleData.xaml

此外,我预计必须将构建操作设置为“DesignData”或类似的,但这似乎不是 Visual Studio 2012 中的选项?

我需要做什么才能让design time data 在 VS2012/Blend 中工作?

【问题讨论】:

    标签: c# xaml windows-8 microsoft-metro expression-blend


    【解决方案1】:

    SpecialEvent 是您的 ViewModel 吗?如果是这样,你能在你的 XAML 中做这样的事情吗(直接在你的 common:LayoutAwarePage 打开声明之后)?

    <d:Page.DataContext>
        <local:SpecialEvent>
    </d:Page.DataContext>
    

    然后从你的 common:LayoutAwarePage 中删除这一行:

    d:DataContext="{d:DesignData Source=../SampleData/SpecialEventSampleData.xaml}" 
    

    我有与此类似的代码正在运行。

    【讨论】:

      【解决方案2】:

      在 Windows Phone(我相信)中,示例数据文件的路径是相对于应用程序根目录的。在 Windows 8 中,示例数据文件的路径是相对于您要在其中使用的页面 xaml 文件

      在上面的示例中,page.xaml 文件需要位于项目的子文件夹中,但与 SampleData 位于不同的文件夹中。

      Windows 8 示例数据不会自动为您创建集合实例。所以,如果你有这样的样本数据:

      <Event>
       <Attendees>
         <Attendee Name="Joe" />
       </Attendees>
      </Event>
      

      您需要确保在定义变量时将 Attendees 属性的支持字段设置为新的集合实例。如果您使用自动属性(Attendees { get; set; } 语法),则需要在构造函数中将属性设置为新的集合实例,然后才能在 xaml 中添加项目。

      最后,Windows 8 xaml 无法处理泛型类型。因此,如果您的 Attendees 属性属于 Collection 类型,您将无法在 xaml 中创建它的实例。

      您始终可以创建一个名为 AttendeeCollection 的简单类,该类继承自 Collection,并在您的 xaml 中创建该类的实例。

      希望对您有所帮助。

      【讨论】:

      • 我的视图模型的所有属性都是原始类型或框架提供的类型(有一个 Uri,但主要是 DateTime/string/double)
      【解决方案3】:

      尝试使用 xaml 文件的完整路径而不是相对路径。

      【讨论】:

      • 我之前尝试过,结果相同(即它对我不起作用)
      • 可能,公共构造函数调用代码,抛出异常
      【解决方案4】:

      这有点晦涩难懂,但归结为我在 View-Model 上实现了 INotifyPropertyChanged

      在我的 Windows Phone 代码中,我必须做一些工作来确保后台工作线程引发的事件在 UI 线程上弹出:

      protected delegate void OnUIThreadDelegate();
      protected void OnUIThread(OnUIThreadDelegate onUIThreadDelegate)
      {
          if (Deployment.Current.Dispatcher.CheckAccess())
          {
              onUIThreadDelegate();
          }
          else
          {
              Deployment.Current.Dispatcher.BeginInvoke(onUIThreadDelegate);
          }
      }
      

      然后使用它:

      protected override void OnPropertyChanged(PropertyChangedEventArgs e)
      {
          OnUIThread(() =>
          {
              base.OnPropertyChanged(e);
          });
      }
      

      似乎在移植该代码时,我没有检查 CoreWindow.GetForCurrentThread() 的结果,这导致异常在代码最黑暗的深处触发,因为设计者正在为我的类型设置属性,而我试图引发事件并可怕地死去。我的错。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-24
        • 2014-06-15
        相关资源
        最近更新 更多