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に追加する前に、コンストラクターでプロパティを新しいコレクションインスタンスに設定する必要があります。

最後に、Windows8xamlはジェネリック型を処理できません。したがって、AttendeesプロパティのタイプがCollection <Attendee>の場合、xamlでそのインスタンスを作成することはできません。

Collection <Attendee>から継承するAttendeeCollectionという単純なクラスをいつでも作成し、代わりにそのインスタンスをxamlに作成できます。

お役に立てば幸いです。

于 2012-08-06T23:10:10.803 に答える
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 に答える
0

相対パスではなく、xaml ファイルへのフル パスを試してください。

于 2012-07-25T07:31:50.153 に答える