2012-07-24 77 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()這是引起異常火在代碼的最黑暗的深處深深的結果,因爲設計師是我的類型設置的屬性,我試圖提高均勻度反而可怕地死去。我的錯。

相關問題