2012-07-24 45 views
3

我一直在Windows Phone应用程序中愉快地使用DesignData,并且我希望能够使用它来帮助VS2012/Blend中的Metro风格应用程序中的设计可视化。如何使用DesignData来帮助开发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工作室给出错误:

Error Cannot create an instance of "SpecialEvent". C:...\MyRootNamespace.Windows\SampleData\SpecialEventSampleData.xaml

此外,我期待有将构建操作设置为“DesignData”或类似操作,但这在Visual Studio 2012中似乎不是一个选项?

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

回答

4

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

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

,然后从共同删除此行

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

我有与此类似的是工作代码。

0

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

+0

我试过之前,同样的结果(即它并没有为我工作) – 2012-07-25 07:52:21

+0

也许,公共构造函数调用代码,抛出异常 – 2012-07-25 08:08:44

1

在Windows Phone中(我相信)示例数据文件的路径是相对于应用程序根目录的。在Windows 8中,你想使用它的路径样本数据文件是相对于页面XAML文件。

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

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

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

你需要确保为与会者支持字段,当你定义变量属性设置为一个新的集合实例。如果您正在使用自动属性(参与者{get; set;}语法),则需要在将项目添加到xaml中之前,将属性设置为构造函数中的新集合实例。

Finaly,Windows 8 xaml无法处理泛型类型。因此,如果您的参加者属性类型为集合<参加者>您将无法在xaml中创建它的实例。

你总是可以创建一个名为AttendeeCollection简单的类,从收藏<与会者>继承和XAML中创建的那个实例来代替。

希望有所帮助。

+0

我所有的视图模型的特性是简单或者框架提供的类型(有一个Uri,但主要是DateTime/string/double) – 2012-08-13 18:56:55

0

这是一个不太明显的触摸,但它归结为我的视图模型上实现的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()这是引起异常火在代码的最黑暗的深处深深的结果,因为设计师是我的类型设置的属性,我试图提高均匀度反而可怕地死去。我的错。

相关问题