2011-02-26 1 views
1

좋아, Windows Phone 7/Silverlight 프로그래밍에 익숙해 져서 상당히 직설적 인 프로세스라고 생각하는 것을 시작했습니다. , 불행히도 (잘하면!) 작은 문제가 발생했습니다.일반용, 재사용 가능한 Windows Phone 7 XAML 양식 만들기 및 클래스 라이브러리에서 사용하기

기본적으로 제 응용 프로그램 제품군의 모든 응용 프로그램에 표준 인 "About.xaml"양식과 같은 일반적인 XAML 양식을 만들려고합니다. 이 '정보'화면이 동일하게 보이고 호출 응용 프로그램에서 채워지는 몇 가지 필드 (예 : 응용 프로그램 이름 등) 만 다를뿐입니다. 또한 공유되므로 새로운 기능/버그 수정/개선 기능으로 모든 앱 (즉, 재사용 등)에 도움이됩니다. 내 생각에이 XAML 폼은 다양한 응용 프로그램에서 참조 할 수있는 클래스 라이브러리에 '살아 있어야합니다.

문제점을 강조 표시하기 위해 두 가지 프로젝트로 샘플 솔루션을 만들었습니다.

A screenshot of the solution showing the two projects

첫째을, 나는 윈도우 폰 파노라마 응용 프로그램을 만듭니다 "WindowsPhonePanoramaApplication1"라고 불렀다. 다음으로, "WindowsPhoneClassLibrary1"이라고 부르는 Windows Phone 클래스 라이브러리를 만듭니다.

"WindowsPhoneClassLibrary1"에서 "Windows Phone Portrait Page"유형의 새 양식 클래스를 만들고 "About.xaml"이라고합니다.

문제를 재현하기 위해 파노라마의 첫 번째 페이지에있는 목록 상자의 "SelectionChanged"이벤트와 같은 이벤트를 선택했습니다. 이전 이벤트는 "NavigationService.Navigate (...))

뒤에 코드에서
<!--Panorama item one--> 
    <controls:PanoramaItem Header="first item"> 
     <!--Double line list with text wrapping--> 
     <ListBox Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="ListBox_SelectionChanged"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Margin="0,0,0,17" Width="432"> 
         <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
         <TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </controls:PanoramaItem> 

, 내가 가지고있는 인 selectionchanged 이벤트에 다음 코드를

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    NavigationService.Navigate(new Uri("/AboutPage.xaml", UriKind.RelativeOrAbsolute)); 
} 

내가 응용 프로그램을 실행하고 목록 상자에있는 항목 중 하나를 클릭, 메서드 RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)이 호출되고 응용 프로그램이 th에서 중단됩니다. 전자 Debugger.Break() 라인 : 거기에 Exception 객체에서 찾고 NavigationFailedEventArgs 매개 변수에

RootFrame_NavigationFailed method

는, 다음과 같은 오류가 표시됩니다 :

{"No XAML was found at the location '/AboutPage.xaml'."} 
    [System.InvalidOperationException]: {"No XAML was found at the location '/AboutPage.xaml'."} 
    _data: null 
    _HResult: -2146233079 
    _innerException: null 
    _message: "No XAML was found at the location '/AboutPage.xaml'." 
    _methodDescs: {System.IntPtr[16]} 
    _optionalData: null 
    Data: {System.Collections.ListDictionaryInternal} 
    HResult: -2146233079 
    InnerException: Could not evaluate expression 
    Message: "No XAML was found at the location '/AboutPage.xaml'." 
    StackTrace: " at System.Windows.Navigation.PageResourceContentLoader.EndLoad(IAsyncResult asyncResult)\r\n at System.Windows.Navigation.NavigationService.ContentLoader_BeginLoad_Callback(IAsyncResult result)\r\n at System.Windows.Navigation.PageResourceContentLoader.BeginLoad_OnUIThread(AsyncCallback userCallback, PageResourceContentLoaderAsyncResult result)\r\n at System.Windows.Navigation.PageResourceContentLoader.<>c__DisplayClass4.<BeginLoad>b__0(Object args)\r\n at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)\r\n at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)\r\n at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)\r\n at System.Del 
egate.DynamicInvokeOne(Object[] args)\r\n at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)\r\n at System.Delegate.DynamicInvoke(Object[] args)\r\n at System.Windows.Threading.DispatcherOperation.Invoke()\r\n at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)\r\n at System.Windows.Threading.Dispatcher.OnInvoke(Object context)\r\n at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)\r\n at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)\r\n at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult)\r\n" 

가 나는이 오류의 원인 꽤 확신 "About.xaml"은 "WindowsPhoneClassLibrary1"클래스 라이브러리에 있으며 응용 프로그램이 실행되고있는 "WindowsPhonePanoramaApplication1"이 아니기 때문입니다.

"WindowsPhonePanoramaApplication1"에 대해 생성 된 XAP 파일을 검사했으며 그 안에 "WindowsPhoneClassLibrary1.dll"이라는 어셈블리가 있어야합니다. 또한 Jeff Prosise의 블로그 which highlights a way to navigate to a XAML form in an external assembly in Silverlight 4 (INavigationContentLoader 인터페이스 사용)에 대한 링크를 발견했지만 Windows Phone 7은 Silverlight 3을 기반으로하고 WP7 설명서를 검색하면 해당 인터페이스가 정의되어 있지 않습니다. URIMapping/URIMapper 클래스를 찾아 보았지만 클래스 라이브러리에서 NavigationService 모양을 찾을 수는 없습니다.

질문은 Windows Phone 7 용 Silverlight 3/Silverlight를 사용하여 "WindowsPhonePanoramaApplication1"의 "NavigationService"에서 "About.xaml"클래스 라이브러리 "WindowsPhoneClassLibrary1" 형태? 확실히 클래스 라이브러리에서 XAML 양식을 다시 사용할 수있는 방법이 있어야합니까?

또한 위의 방법이 일반적인 XAML 양식을 다시 사용하는 잘못된 방법 일 경우 올바른 방향으로 나를 가리키는 도움말/링크에 관심이 있습니다. 당신이 요약

:-) 구문을 알고있는 경우 사전에 어떤 도움

감사합니다, 그것은 훨씬

+0

아차, 말씀하신한다, 나는 [2011년 1월] (http://www.microsoft.com/downloads/en/details.aspx?FamilyID=49b9d0c5-6597-4313-를 사용하고 있습니다 912a-f0cca9c7d277 & displaylang = en) Windows Phone Developer Tools의 설치. –

답변

2

솔루션 at this link 발견 ... 감상 할 수있다, 매우 간단는 나를 위해 일한 다음 :

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    NavigationService.Navigate(new Uri("/WindowsPhoneClassLibrary1;component/AboutPage.xaml", UriKind.Relative)); 
}