如何使用DesignData帮助开发Metro应用程序?

时间:2012-07-24 20:00:51

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

我一直在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中工作?

4 个答案:

答案 0 :(得分:4)

SpecialEvent是您的ViewModel吗?如果是这样,你可以在你的XAML中做这样的事情(直接在你的常见之后:LayoutAwarePage开放声明)?

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

然后从您的公共区域删除此行:LayoutAwarePage:

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

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

答案 1 :(得分:1)

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

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

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

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

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

最终,Windows 8 xaml无法处理泛型类型。因此,如果您的参加者属性类型为 Collection&lt; Attendee&gt; ,您将无法在xaml中创建它的实例。

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

希望有所帮助。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这一点模糊不清,但归结为我在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()的结果在代码的最深处深处触发,因为设计者在我的类型上设置了属性,而我正在努力提高事件并且可怕地死去。我的坏。