3

我一直在 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 中的选项?

我需要做什么才能让设计时数据在 VS2012/Blend 中工作?

4

4 回答 4

4

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

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

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

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

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

于 2012-08-06T19:00:18.847 回答
1

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

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

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

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

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

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

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

希望有帮助。

于 2012-08-06T23:10:10.803 回答
0

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

于 2012-07-25T07:31:50.153 回答
0

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

在我的 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()导致异常在代码的最黑暗深处触发的结果,因为设计人员正在为我的类型设置属性,并且我试图引发事件而是可怕地死去。我的错。

于 2012-08-13T19:21:25.167 回答