Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
windows Phone¿ª·¢£¨Èý£©-- µ¼º½Ô­Àí·ÖÎö
 
×÷Õߣºcc_net À´Ô´£ºCSDN ·¢²¼ÓÚ 2015-03-31
  1633  次浏览      28
 

ǰÁ½ÆªÎÄÕÂÖУ¬ÎÒÃǵÄDemo´úÂë¶¼ÊÇ»ùÓÚÒ³ÃæÇл»µÄ£¬¶øÎÒÃÇÔÚSilverlight¿ò¼ÜÏ¿ª·¢µÄ¾ÍÊÇÒÔXAMLÎļþΪ»ù´¡µÄʼþÇý¶¯³ÌÐò¡£Ò²¾ÍÊÇ˵ÎÒÃǵijÌÐò»áÓÉÒ»¸ö»ò¶à¸öÒ³Ãæ×÷³É£¬ÕâÒ»µãºÍWeb³ÌÐòºÜÏàËÆ£¬ËùÒÔÒ³Ãæ¼äµÄÇл»¾ÍºÜÖØÒª¡£ ÕâһƪÎÄÕ¾ÍÀ´½«½éÉÜWindows Phoneƽ̨Éϵ¼º½¹¦ÄÜ¡£

Ò» µ¼º½¿Ø¼þ

´ÓSilverlight3¿ªÊ¼£¬ÌṩÁËÄÚÖõĵ¼º½¿ò¼Ü£¬¿ÉÒԱȽÏÇáËɵÄÔÚ Silverlight PageÖ®¼ä½øÐÐÇл»£¬²¢ÇÒ¿ÉÒÔºÍä¯ÀÀÆ÷µÄǰ½ø¡¢ºóÍ˰´Å¥¼¯³É¡£ÔÚSilverlight 3֮ǰµÄ°æ±¾£¬SilverlightûÓÐÌØ¶¨µÄµ¼º½¿ò¼Ü£¬ÏîÄ¿ÖÐÒ³ÃæÖ®¼äµÄÇл»ÊÇͨ¹ýÐÞ¸ÄRootVisual²¼¾ÖÈÝÆ÷µÄÄÚÈݶøÊµÏÖµÄ
¡£ÀûÓÃSDKÖÐÌṩÁËFrameºÍPage¿ÉÒÔÍê³Éµ¼º½²Ù×Ý¡£ÆäÖÐFrameÊǵ¼º½µÄ¿ò¼Ü£¬Pageͨ¹ýFrame¼ÓÔØÏÔʾ²¢ÊµÏÖÒ³Ãæ¼äµÄµ¼º½¡£

Windows Phone³ÌÐòÒ²ÊÇ»ùÓÚSliverlightµÄPage Model½øÐе¼º½£¬Í¬Ê±ÄãÒ²¿ÉÒÔʹÓúóÍ˰´Å¥½øÐкóÍ˲Ù×Ý¡£WPÉϺËÐĵĵ¼º½ÈÝÆ÷¿Ø¼þΪPhoneApplicationFrame£¬Ëû¿ÉÒÔÈÝÄÉÒ»¸öPhoneApplicationPage¡£ÎÒÃÇ¿ÉÒÔ´´½¨¶à¸öÒ³Ãæ£¬Í¨¹ýFrameÀ´½øÐе¼º½¡£

¶ÔÓÚWindows PhoneÀ´Ëµ£¬Ö»ÔÊÐíÓÐÒ»¸öFrame£¬Ò»¸öFrameÓÐÒ»ÏÂÌØÐÔ£º

²Ù×÷¼ÄËÞµÄPageÒ³ÃæµÄÊôÐÔ£¬±ÈÈçorientation

Ö¸¶¨Ò³Ãæ³ÊÏֵĿͻ§¶ËÇøÓò

Ϊ״̬À¸ºÍ³ÌÐòÀ¸±£Áô¿Õ¼ä

¼àÌýobscuredºÍunobscuredʼþ

¶ø¶ÔÓÚPageÀ´Ëµ£¬Ëû»áÌî³äÂúFrameËùÔڵĿռ䡣³ý´ËÖ®Í⣬³ÌÐòÖл¹ÓÐStatus barºÍApplication Bar£¬ËûÃǶ¼ÄÜÉèÖÃvisible ÊôÐÔ£»Window PhoneÒ²Ö§³ÖÆÁÄ»Ðýת£¬µ«ÊÇÖ»ÓÐÔÚת¶¯É豸ʱ²ÅÄÜʹ֮Ðýת£¬¶ø²»ÄÜͨ¹ý±à³ÌµÄ·½Ê½ÊµÏÖ£¬ÒòΪorientationÊÇÖ»¶ÁÊôÐÔ£»ÎÒÃÇÖ»ÄÜͨ¹ýÉèÖÃSupportedOrientationsÀ´Íê³É£»»úÆ÷µÄºóÍ˰´Å¥¿ÉÒÔÍê³Éµ¼º½ÖеĺóÍ˹¦ÄÜ£¬Ò²ÄܹرռüÅÌ£¬²Ëµ¥£¬µ¯³ö´°Ì壬ͬʱ»¹ÄܹرճÌÐò¡£

¹ØÓÚʹÓÃÕâÁ½¸ö¿Õ¼äµ¼º½£¬²Î¼ûǰÁ½ÆªÎÄÕµÄÀý×Ó¡£¶¨ÒåÒ»¸öFrame£¬ÉèÖõ½VisualRoot¡£ÔÚÅäÖÃÎļþÖÐÉèÖÿªÊ¼µ¼º½µÄÒ³Ãæ¡£È»ºóͨ¹ýFrame»òÕßNavigationServiceÀ´½øÐе¼º½¡£²Î¿¼ £ºFrame and Page Navigation for Windows Phone

¶þ µ¼º½¿ò¼Ü·ÖÎö

ÎÒÃÇ»¹ÊǽÓ×ÅÉÏһƪÎÄÕ³ÌÐòÆô¶¯À´Õ¹¿ª£¬¿´¿´FrameÊÇÈçºÎÈ¥µ¼º½µÄ¡£

1 µ¼º½¿ò¼ÜµÄ³õʼ»¯

³ÌÐòÆô¶¯µÄµÄµÚÒ»²½ÊÇÔÚAppÀàÖУ¬ÎÒÃÇ´´½¨ÁËÒ»¸öPhoneApplicationFrameʵÀý¡£ÒòΪPhoneApplicationFrameÊǼ̳ÐÓÚFrameµÄ£¬ËùÒÔÎÒÃÇÏÈ¿´¿´Frame¹¹Ô캯Êý×öÁËʲô¡£

internal Frame()  
{
base.DefaultStyleKey = typeof(Frame);
base.Loaded += new RoutedEventHandler(this.Frame_Loaded);
this._hostInfo = new HostInfo();
}

¹¹Ô캯ÊýÖаó¶¨Ò»¸öLoadedʼþºÍÉèÖÃHostÐÅÏ¢£¨Èç¹û¿´¹ýSilverLightµÄÔ´Â룬»á·¢ÏÖºÍÕâµÄ¹¹Ô캯ÊýÊÇÓÐÇø±ðµÄ£©¡£½ÓמͿ´¿´PhoneApplicationFrameµÄ¹¹Ô캯Êý

//ÓÐɾ¼õ  
public PhoneApplicationFrame()
{
Action a = null;
ShellFrame.Initialize();
base.DefaultStyleKey = typeof(PhoneApplicationFrame);
this.Orientation = PageOrientation.PortraitUp;
this._visibleRegion = rect;
base._navigationService = new NavigationService(this);
if (!Frame.IsInDesignMode() && !base._hostInfo.Rehydrated)
{
if (a == null)
{
a = delegate {
base.Load();
};
}
Deployment.Current.Dispatcher.BeginInvoke(a);
}
if (Current == null)
{
Current = this;
}
}

ÕâÀïÃæÇ°ÃæÒ»²¿·ÖÊÇÉèÖýçÃæ·½ÏòÏà¹ØµÄһЩÄÚÈÝ£¬È»ºóÉèÖÃÁ˿ɼûÇøÓò£¬ÕâÀﱻʡÂÔÁË£¬ÕâЩ¶¼ÊÇÉÏÃæËµµÄFrameÓеÄÌØÐÔ£»½ÓÏÂÀ´µÄ¹¤×÷ºÜÖØÒª¶¨ÒåÁËÒ»¸öNavigationService¶ÔÏ󣬱£´æÔÚFrameµÄ×Ö¶ÎÖС£ÎÒÃǽÓ×Å¿´¿´Õâ¸öNavigationService¶ÔÏó¹¹Ô캯Êý

internal NavigationService(PhoneApplicationFrame nav)  
{
this._navigationPendingLock = new object();
this._cacheRequiredPages = new Dictionary<string, PhoneApplicationPage>();
PerfUtil.BeginLogMarker(MarkerEvents.TH_INIT_NAVIGATIONSERVICE, "NavigationService started");
Guard.ArgumentNotNull(nav, "nav");
this._host = nav;
HostFrame = nav;
HostInfo info = new HostInfo();
this._shellPageManagerCallback = new ShellPageManagerCallback();
this._shellPageManagerCallback.OnCancelRequestEventHandler = (EventHandler) Delegate.Combine (this._shellPageManagerCallback.OnCancelRequestEventHandler, new EventHandler(this.ShellPageManager_OnCancelRequest));
this._shellPageManagerCallback.OnPageStackReactivatedEventHandler = (EventHandler<PageStackReactivatedEventArgs>) Delegate.Combine(this._shellPageManagerCallback.OnPageStackReactivatedEventHandler, new EventHandler<PageStackReactivatedEventArgs>(this.ShellPageManager_OnPageStackReactivated));
this._shellPageManagerCallback.OnResumePageRequestEventHandler = (EventHandler<ResumePageRequestEventArgs>) Delegate.Combine(this._shellPageManagerCallback.OnResumePageRequestEventHandler, new EventHandler<ResumePageRequestEventArgs>(this.ShellPageManager_OnResumePageRequest));
this._shellPageManagerCallback.OnInvokeReturningEventHandler = (EventHandler<InvokeReturningEventArgs>) Delegate.Combine(this._shellPageManagerCallback.OnInvokeReturningEventHandler, new EventHandler<InvokeReturningEventArgs>(this.OnInvokeReturning));
this._shellPageManager = new ShellPageManager(info.LastInstanceId, info.HostWnd, this._shellPageManagerCallback);
this._shellPageManager.OnObscurityChangeEventHandler += new EventHandler<ObscurityChangeEventArgs> (this._host.ShellPageManager_OnObscurityChange);
this._shellPageManager.OnLockStateChangeEventHandler += new EventHandler<LockStateChangeEventArgs> (this._host.ShellPageManager_OnLockStateChange);
this._shellPageManager.PauseSupported = true;
this._quirkShouldNotAllowBackgroundNavigation = QuirksMode.ShouldNotAllowBackgroundNavigation();
this._quirkShouldCallOnNavigatingFromPageForExternalNav = QuirksMode.ShouldCallOnNavigatingFromPageForExternalNavigations();
this._quirkShouldForceTextBindings = QuirksMode.ShouldForceTextBindings();
ChooserListener.Initialize();
}

ÕâÀïÖ÷ÒªÊǶ¨ÒåÁËÒ»¸ö_cacheRequiredPagesºÍÉèÖÃÁËhostºÍFrameµÄֵΪ´«ÈëµÄPhoneApplicationFrame¶ÔÏó¡£Õâʱ£¬PhoneApplicationFrameºÍNavigationServiceÏ໥ÒýÓöԷ½£¬ºÍÃæ°ó¶¨ÁËһЩʼþ¡£¶øPhoneApplicationFrame¹¹Ô캯Êý¼ÌÐøÖ´ÐУ¬Dispatcher.BeginInvoke(a)À´Ö´ÐÐFrame.Load·½·¨¡£

internal void Load()  
{
if (!this._loaded)
{
this._navigationService.InitializeJournal();
this._navigationService.InitializeContentLoader();
this._navigationService.InitializeNavigationCache();
this._loaded = true;
if (!IsInDesignMode())
{
UriMapperBase uriMapper = this.UriMapper;
if (!this._navigationService.Resume())
{
string uriString = this.ApplyDeepLinks();
if (uriString != null)
{
this.Navigate(new Uri(uriString, UriKind.Relative));
}
else if (this._deferredNavigation != null)
{
this.Navigate(this._deferredNavigation);
this._deferredNavigation = null;
}
else if (this.Source != null)
{
this.Navigate(this.Source);
}
else if (uriMapper != null)
{
Uri uri = new Uri(string.Empty, UriKind.Relative);
Uri uri2 = uriMapper.MapUri(uri);
if ((uri2 != null) && !string.IsNullOrEmpty(uri2.OriginalString))
{
this.Navigate(uri);
}
}
}
}
else if (this.Source != null)
{
base.Content = string.Format(CultureInfo.InvariantCulture, Resource.Frame_DefaultContent, new object[] { this.Source.ToString() });
}
else
{
base.Content = typeof(Frame).Name;
}
}
}

ÎÒÃÇ×Ðϸ¿´¿´Õâ¸ö·½·¨¡£

A. Ö´ÐÐÁË3¸ö³õʼ»¯µÄ·½·¨£¬InitializeJournal³õʼ»¯ÀúÊ·¼Ç¼Ïà¹ØµÄ¶ÔÏó£¬InitializeNavigationCache³õʼ»¯»º´æÏà¹ØµÄ¶ÔÏó;
InitializeContentLoader³õʼ»¯ÄÚÈݼÓÔØÏà¹ØµÄ¶ÔÏó

B. InitializeContentLoaderÖÐÉú³ÉÁËÒ»¸öPageResourceContentLoader¶ÔÏó£¬ËüÊÇ Silverlight ¿ò¼ÜÖе±Ç°Î¨Ò»µÄ INavigationContentLoaderʵÏÖ¡£ËûµÄ×÷ÓþÍÊÇÓÃÀ´¼ÓÔØÒªÏÔʾµÄxamlÒ³Ãæ£¬ÕâÀïÊÇΪFrame¼ÓÔØPage×ö×¼±¸£¬ºóÃæ»á¼ÌÐø½éÉÜ¡£

C. È»ºóÎÒÃÇ¿´µ½Ò»Ð©ÁеÄNavigate·½·¨¡£¼ÇµÃÉÏһƪÖÐÎÒÃÇ̸µ½¹ýΪʲôûÓе÷ÓÃNavigate»òÕßÉèÖÃSourceÊôÐÔ£¬»¹ÄÜÏÔʾMainPage.xamlµÄÎÊÌâ¡£Êǵ쬾ÍÔÚÕâÀÔÚÕâÀïµ÷ÓÃÁËNavigate·½·¨¡£µ½µ×ÊÇÄÇÒ»¸ö·½·¨ÄØ£¿ÎÒÃÇÔÚÕâÀï×ö¸öСʵÑé¡£

//NavigationPage="MainPage.xaml" ɾ³ýÕâ¸öÊôÐÔ  
<Tasks>
<DefaultTask Name ="_default">
</Tasks>

ÐÞ¸ÄWMAppMainfest.xmlÎļþ¡£ÕâÑù¾ÍûÓÐĬÈϵÄÒ³ÃæÁË£¬ÎÒÃÇÔÚAppÖмÓÈë¶ÔSourceµÄÉèÖúÍNavigateµ÷Óá£

RootFrame = new PhoneApplicationFrame();  
RootFrame.Source = new Uri("/Page1.xaml", UriKind.Relative);
RootFrame.Navigate(new Uri("/Page2.xaml", UriKind.Relative));
RootFrame.Navigated += CompleteInitializePhoneApplication;

ÔËÐгÌÐò·¢ÏÖ³ÌÐòÕý³£ÏÔʾÁËPage2.xamlÒ³Ãæ£¬ÄÇô˵Ã÷µÚÒ»¸öÌõ¼þÅжϵÄApplyDeepLinks·½·¨ÊÇ´ÓÅäÖÃÎļþÖлñÈ¡NavigationPageµÄ·½·¨¡£¾ßÌåÈçºÎ»ñµÃµÄÕâÀï¾Í²»ÉÁË£¬ÓÐÐËȤ×Ô¼º¿´Ô´Âë°É£¬Í¨¹ýµ÷ÊÔ·¢ÏÖÊÇÔÚHost¶ÔÏóµÄTaskPageÊôÐÔÖС£ÕâʱFrame¾Íµ¼º½µ½ÁËÖ¸¶¨µÄÒ³Ãæ¡£´ËʱҲÍê³ÉÁ˵¼º½¿ò¼ÜµÄ³õʼ»¯¡£ÄÇôϵͳÈçºÎ»ñµÃPage2µÄUriµÄÄØ£¿Õâ¸öºóÃæ½âÊÍ¡£

private void InitializePhoneApplication()  
{
if (phoneApplicationInitialized)
return;

RootFrame = new PhoneApplicationFrame();
RootFrame.Navigated += CompleteInitializePhoneApplication;
RootFrame.NavigationFailed += RootFrame_NavigationFailed;
phoneApplicationInitialized = true;
}

private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
{
// Set the root visual to allow the application to render
if (RootVisual != RootFrame)
RootVisual = RootFrame;

// Remove this handler since it is no longer needed
RootFrame.Navigated -= CompleteInitializePhoneApplication;
}

ÎÒÃÇÔÚ»ØÍ·¿´¿´ÉÏһƪÁôϵÄÒÉÎÊ£¬ÎªÊ²Ã´ÕâÀïÒª°ó¶¨Navigatedʼþ¡£ÏÖÔÚÓ¦¸ÃÃ÷°×ÁË£¬ÔÚPhoneApplicationPhoneµÄ¹¹Ô캯ÊýÖУ¬µ÷ÓÃÁËNavigate·½·¨µ¼º½µ½ÅäÖÃÎļþÖеÄMainPage.xaml£¬µ±µ¼º½Íê³Éʱ£¬¾Í°ÉFrameÉèÖõ½VisualRoot£¬Õâʱ¾ÍÄܰÑFrameÖеÄPageÏÔʾ³öÀ´ÁË¡£ÕâÀï¿ÉÄÜ»áÓиöÒÉÎÊ£¬ÔÚ¹¹Ô캯ÊýÖе÷ÓÃNavigation£¬µ«ÔÚ¶ÔÏó¹¹ÔìÍê²Å°ó¶¨Navigatedʼþ£¬ÕâÄÜÐÐÂ𣿠ÔÚ¹¹Ô캯ÊýÖе÷ÓõÄÊÇÏÂÃæµÄ·½·¨£º

Deployment.Current.Dispatcher.BeginInvoke(a);  

Õâ·½·¨Êµ¼ÊÊǰѲÙ×÷·¢ËÍUIÏß³ÌÖ´ÐУ¬µ«ÊÇĿǰÎÒÃÇ»¹ÔÚÖ´ÐÐAppµÄ¹¹Ô캯Êý£¬ËùÓÐÖ»Óй¹ÔìºÃApp¶ÔÏóUI²ÅÄÜ´¦ÀíÕâ¸öLoad²Ù×÷£¬ÕâÊÇÎÒ¸öÈË¿´·¨²»ÖªµÀ¶Ô²»¶Ô£¬ÓдýÔÚÑо¿¡£

2 Frame¼ÓÔØXAMLÎļþ

¿ò¼Ü³õʼ»¯Íê³Éºó£¬Ö´ÐÐLoad·½·¨ÖеÄNavigate£¬ÈÃFrameµ¼º½µ½Ö¸¶¨Ò³Ã棬ÄÇôµ¼º½µ½Õâ¸öÒ³ÃæÊÇÔõô¼ÓÔØÕâ¸öÒ³ÃæµÄÄØ£¿ ÎÒÃÇÏÈ¿´¿´FrameµÄNavigate·½·¨µ½µ×ÊÇÔõôִÐеġ£

public bool Navigate(Uri source)  
{
if (this._loaded)
{
return this._navigationService.Navigate(source);
}
this._deferredNavigation = source;
return true;
}

ÎÒÃÇ·¢ÏÖËþʵ¼ÊÊǵ÷ÓÃNavigationServiceµÄ·½·¨£¬Êµ¼ÊÉÏFrameºÍNavigationServiceÖÐÓкܶàͬÃûµÄ·½·¨£¬Êµ¼Ê¶¼ÊÇÔÚNavigationServiceÀàÖÐʵÏֵģ¬Ëû²ÅÊÇʵ¼Ê¸ºÔ𵼺½ºÍ¼ÓÔØÒ³ÃæµÄ¡£ÕâÒ²ºÍÎÒÃÇ¿ªÊ¼±ê×¢µÄFrameµÄ4µãÌØÐÔÎǺϡ£

ÕâÀﻹÓиö_deferredNavigation×ֶΣ¬±íʾÑÓ³Ùµ¼º½¡£Êµ¼ÊÕâ¸öÎÒÃÇÔÚÉÏÃæµÄÀý×ÓÖÐÁôϵÄÒÉÎÊ¡£ÉÏÃæµÄÀý×ÓÎÒÃÇɾ³ýµôÅäÖÃÎļþÖеÄMainPage.xaml£¬¶øÔö¼ÓÁ˵÷ÓÃRootFrame.Navigate·½·¨ÏÔʾÁËPage2£¬Õâʱ²¢Ã»ÓÐÕæµÄµ¼º½£¬Ó¦ÎªFrame»¹Ã»Óгõʼ»¯ºÃ£¬Ö»ÊǰüUri±£´æµ½ÁËÕâ¸ö×Ö¶ÎÖС£ËùÒÔ·µ»ØTrue²»´ú±íÍê³Éµ¼º½¡£µÈApp¹¹ÔìÍê³É£¬Ö´ÐÐLoad·½·¨Ê±Ã»ÓлñÈ¡ÅäÖÃÎļþ£¬¶ø_deferredNavigation×Ö¶ÎÓÖÓÐÖµ£¬¾Íµ¼º½µ½ÁËPage2¡£

public bool Navigate(Uri source)  
{
Action a = null;
Uri uri = source;
NavigationMode mode = NavigationMode.New;
PerfUtil.BeginLogMarker(MarkerEvents.TH_PAGE_NAVIGATION, "Page navigation: " + ((uri == null) ? "" : uri.ToString()));
try
{
JournalEntry journalEntry = new JournalEntry(uri.OriginalString, uri);
this.Journal.AddHistoryPoint(journalEntry);
return true;
}
catch (Exception exception)
{
if (this.RaiseNavigationFailed(uri, exception))
{
throw;
}
return true;
}
}

ÒÔÉÏ´úÂëÊÇNavigationService.Navigate·½·¨µÄʵÏÖ£¬Ö»±£ÁôÁ˹ؼü´úÂë¡£ÆäÖн«´«ÈëµÄUri±£´æµ½ÁËÒ»¸öJournalEntryµÄʵÌåÀàÖУ¬´ËÀàÊDZíʾºóÍË»òǰ½øµ¼º½ÀúÊ·¼Ç¼ÖеÄÒ»¸öÌõÄ¿¡£ÎÒÃǰѼÓÔØµÄPage¶¼ÓÃAddHistoryPoint±£´æÆðÀ´¡£

internal void AddHistoryPoint(JournalEntry journalEntry)  
{
Guard.ArgumentNotNull(journalEntry, "journalEntry");
this._shellPagePending = this._shellPageManager.CreatePage(journalEntry.Source.ToString());
if (this._shellPagePending == null)
{
throw new InvalidOperationException("Unable to create ShellPage");
}
this._shellPagePending.ShellPageCallback.OnNavigateAwayEventHandler += new EventHandler<NavigateAwayEventArgs>(this.ShellPage_NavigatedAway);
this._shellPagePending.ShellPageCallback.OnNavigateToEventHandler += new EventHandler<NavigateToEventArgs>(this.ShellPage_NavigatedTo);
this._shellPagePending.ShellPageCallback.OnRemoveEventHandler += new EventHandler<RemoveEventArgs>(this.ShellPage_RemovedPage);
this._shellPagePending.ShellPageCallback.OnBackKeyPressInternalEventHandler += new EventHandler<BackKeyPressEventArgs>(this.ShellPage_BackKeyPressed);
this._shellPageManager.NavigateTo(this._shellPagePending);
this.IsBusy = true;
}

ͨ¹ýCreatePage´´½¨ÁËÒ»¸öShellPage¶ÔÏó£¬ÕâÊÇÒ»¸öδ¹«¿ªµÄÀàÐÍ£¬ËùÒÔûÓÐ×ÊÁÏ£¬µ«ÊÇÓ¦¸ÃÊǺͽçÃæÓйأ¬ÕâÀï²»ÉîÈ롣Ȼºó×¢²áÁËÏà¹ØµÄʼþ£¬×îºóµ÷ÓÃÁËNavigateTo·½·¨¡£µ«ÊÇ´Ë·½·¨¿´²»µ½¾ßÌåʵÏÖ¡£¸ù¾ÝÕâÀïÇé¿öÍÆ²âÓ¦¸ÃÊÇÌø×ªµ½Ö¸¶¨µÄShellPageÒ³Ãæ¡£Õâ¸öʱºò»á´¥·¢Journal¶ÔÏóµÄOnNavigateAwayEventʼþ£¬Ö´Ðа󶨵ķ½·¨£º

private void ShellPage_NavigatedAway(object sender, NavigateAwayEventArgs args)  
{
if (!args.IsExternal)
{
if ((args.Direction == Direction.Back) && (this._backStack.Count > 0))
{
this.IsBusy = false;
this._lastRemovedEntry = this._currentEntry;
this._currentEntry = this._backStack.Pop();
NavigationMode back = NavigationMode.Back;
this.UpdateObservables(this._currentEntry, back);
}
}
else
{
this.OnNavigatedExternally("", new Uri("app://external/", UriKind.Absolute), (args.Direction == Direction.Back) ? NavigationMode.Back : NavigationMode.New);
}
}

´Ë·½·¨Öаüº¬Ò»¸öÃûΪUpdateObservables·½·¨£¬´Ë·½·¨ÊÇ

private void UpdateObservables(JournalEntry currentEntry, NavigationMode mode)  
{
bool isPaused = null == currentEntry.PageInstance;
this.OnNavigated(currentEntry.Name, currentEntry.Source, mode, isPaused);
}

OnNavigate´¥·¢ÁËÔÚNavigateServiceÖÐInitializeJournal£¨£©×¢²áµÄJournalµÄNavigatedʼþ

this._journal.Navigated += new EventHandler<JournalEventArgs>(this.Journal_Navigated) 

×îºóÖ´Ðа󶨵ÄNativagetServiceÖеÄJournal_Navigated·½·¨£º

private void Journal_Navigated(object sender, JournalEventArgs args)  
{
this.NavigateCore_ContinueNavigation(args.Uri, args.NavigationMode, args.IsPaused);
}

private bool NavigateCore_ContinueNavigation(Uri uri, NavigationMode mode, bool isPagePaused)
{
try
{
Uri mappedUri = this.GetMappedUri(uri);
Uri mergedUriAfterMapping = this.GetMergedUriAfterMapping(mappedUri);
Uri mergedUri = this.GetMergedUri(uri);
this._currentNavigation = new NavigationOperation(mergedUriAfterMapping, mergedUri, uri, mode);
this.IsNavigationInProgress = true;
if (!isPagePaused && (mode == NavigationMode.Back))
{
PhoneApplicationPage reusedPage = this._journal.CurrentEntry.PageInstance;
this.Host.Dispatcher.BeginInvoke(delegate {
this.CompleteNavigation(reusedPage, mode);
});
}
else
{
if (!isPagePaused && (mode != NavigationMode.New))
{
throw new InvalidOperationException("Invalid NavigationMode, only New and Back are supported");
}
this._contentLoader.BeginLoad(this._currentNavigation.Uri, new AsyncCallback (this.ContentLoader_BeginLoad_Callback), this._currentNavigation);
}
}
catch (Exception exception)
{
if (this.RaiseNavigationFailed(uri, exception))
{
throw;
}
}
return true;
}

ʵ¼ÊÉÏÖ´ÐеľÍÊÇNavigateCore_ContinueNavigation ·½·¨£¬ÎÒÃÇ×¢Òâµ½ ._contentLoader.BeginLoad()·½·¨£¬ÕâÀïÓõ½ÁËÎÒÃÇÇ°ÃæFrame³õʼ»¯Ëµµ½µÄPageResourceContentLoader¶ÔÏóÀ´¼ÓÔØÖ¸¶¨XAMLÎļþ¡£

ÒÔÉϾÍÊÇFrame¼ÓÔØXAMLÎļþµÄÈ«²¿¹ý³Ì¡£´ÓNavigateµ½Êµ¼ÊµÄNavigateCore_ContinueNavigationÖ®¼äºÜ¸ºÔð£¬Éæ¼°ÁËһЩûÓй«¿ªµÄÀàÐÍ¡£µ«Êµ¼ÊÒâͼºÜ¼òµ¥£¬¾ÍÊǶÔÒªµ¼º½µÄÒ³Ãæ½øÐÐÀúÊ·¼Ç¼²Ù×÷¡£

Èý Ò³ÃæµÄÏÔʾ

ÉÏÃæ½éÉÜÁËXAML±»PageResourceContentLoader¶ÔÏó¼ÓÔØµ½Frame¡£ÄÇôXAMLÊÇÈçºÎÏÔʾµ½½çÃæÉϵÄÄØ£¿

Silverlight µ¼º½ÏµÍ³Ê¹ÓôËÀà×÷ΪÆäĬÈϵÄÄÚÈݼÓÔØ³ÌÐò¡£´ËÀàÊÇ INavigationContentLoader µÄĬÈÏʵÏÖ£¬ÇÒ´ËÀàµÄʵÀýÊÇ Frame.ContentLoader ÊôÐÔµÄĬÈÏÖµ¡£ËäÈ»Äúͨ³£»á¼ÓÔØ Page ʵÀý£¬Silverlight µ¼º½ÏµÍ³ÒªÇ󵼺½Ä¿±êӦΪ UserControl ʵÀý¡£Page ÀàÅÉÉú×Ô UserControl À࣬²¢Ìṩ¸½¼Óµ¼º½Ö§³Ö

ÒÔÉÏÊÇMSDN¶ÔPageResourceContentLoaderµÄ½âÊÍ£¬Êµ¼Ê×ÜÓþÍÊǼÓÔØÓ¦ÓóÌÐò°ü£¨.xap Îļþ£©ÖжÔÓ¦ÓÚ¸ø¶¨ URI µÄÒ³¡£ÎÒÃǸù¾ÝÔ´ÂëÒ²¿´µ½Navigate·½·¨×îÖÕÊÇͨ¹ý´Ë¶ÔÏóÀ´¼ÓÔØURIÒ³Ãæ¡£

this._contentLoader.BeginLoad(this._currentNavigation.Uri, new AsyncCallback
(this.ContentLoader_BeginLoad_Callback), this._c

ÎÒÃÇ¿´¿´BeginLoad·½·¨µÄʵÏÖ

public override IAsyncResult BeginLoad(Uri uri, AsyncCallback userCallback, object asyncState)  
{
SendOrPostCallback d = null;
Action a = null;
PageResourceContentLoaderAsyncResult result = new PageResourceContentLoaderAsyncResult(uri, asyncState);
if (uri == null)
{
result.Exception = new ArgumentNullException("uri");
}
if (SynchronizationContext.Current != null)
{
if (d == null)
{
d = delegate (object args) {
BeginLoad_OnUIThread(userCallback, result);
};
}
SynchronizationContext.Current.Post(d, null);
}
else
{
if (a == null)
{
a = delegate {
BeginLoad_OnUIThread(userCallback, result);
};
}
Deployment.Current.Dispatcher.BeginInvoke(a);
}
return result;
}

ʵ¼ÊÊǵ÷ÓÃÁËBeginLoad_OnUIThread·½·¨£¬¶øÀïÃæÓÖµ÷ÓÃÁËGetLocalXaml·½·¨À´¼ÓÔØ±¾µØµÄXAMLÎļþ£¬¶øÇÒ»ñµÃÁËxclassÊôÐÔÖ¸¶¨µÄÀàÐÍ¡£×îºóʹÓÃActivator.CreateInstance´´½¨ÁË´ËXAMLÎļþÀà¶ÔÏóµÄʵÀý£¬±£´æµ½resultÖС£

private static void BeginLoad_OnUIThread(AsyncCallback userCallback, PageResourceContentLoaderAsyncResult result)  
{
if (result.Exception != null)
{
result.IsCompleted = true;
userCallback(result);
}
else
{
try
{
string pagePathAndName = UriParsingHelper.InternalUriGetBaseValue(result.Uri);
string localXaml = GetLocalXaml(pagePathAndName);
if (string.IsNullOrEmpty(localXaml))
{
result.Exception = new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resource.PageResourceContentLoader_NoXAMLWasFound, new object[] { pagePathAndName }));
}
else
{
string xClass = GetXClass(localXaml);
if (string.IsNullOrEmpty(xClass))
{
try
{
result.Content = XamlReader.Load(localXaml);
}
catch (Exception exception)
{
result.Exception = new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resource.PageResourceContentLoader_XAMLWasUnloadable, new object[] { pagePathAndName }), exception);
}
}
else
{
Type typeFromAnyLoadedAssembly = GetTypeFromAnyLoadedAssembly(xClass);
if (typeFromAnyLoadedAssembly == null)
{
result.Exception = new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resource.PageResourceContentLoader_TheTypeSpecifiedInTheXClassCouldNotBeFound, new object[] { xClass, pagePathAndName }));
}
else
{
result.Content = Activator.CreateInstance(typeFromAnyLoadedAssembly);
}
}
}
}
catch (Exception exception2)
{
result.Exception = exception2;
}
finally
{
result.IsCompleted = true;
if (userCallback != null)
{
userCallback(result);
}
}
}
}

ÕâÀïBeginLoadÊÇÓÃÒì²½µÄ·½Ê½À´¼ÓÔØ£¬±ÜÃâUIÏ̵߳ȴý¡£¶ø¼ÓÔØÍê³ÉºóÖ´Ðлص÷·½·¨ ContentLoader_BeginLoad_Callback

private void ContentLoader_BeginLoad_Callback(IAsyncResult result)  
{
DependencyObject obj2 = null;
Uri uriBeforeMapping = null;
try
{
NavigationOperation asyncState = result.AsyncState as NavigationOperation;
NavigationOperation operation2 = this._currentNavigation;
if ((operation2 != null) && (operation2.Uri == asyncState.Uri))
{
uriBeforeMapping = operation2.UriBeforeMapping;
obj2 = this._contentLoader.EndLoad(result) as DependencyObject;
if (!(obj2 is UserControl))
{
throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, Resource.NavigationService_ContentIsNotAUserControl, new object[] { (obj2 == null) ? "null" : obj2.GetType().ToString(), "System.Windows.Controls.UserControl" }));
}
PhoneApplicationPage p = obj2 as PhoneApplicationPage;
if (p != null)
{
this._journal.CompletePendingShellPage(p);
Frame host = this.Host;
p.InternalVisibleRegionChanged += new EventHandler<VisibleRegionChangeEventArgs>(host.OnVisibleRegionChanged);
Frame frame2 = this.Host;
p.BeginOrientationChanged += new EventHandler<OrientationChangedEventArgs>(frame2.OnBeginOrientationChanged);
Frame frame3 = this.Host;
p.BeginLayoutChanged += new EventHandler<OrientationChangedEventArgs>(frame3.OnBeginLayoutChanged);
Frame frame4 = this.Host;
p.InternalBackKeyPress += new EventHandler<CancelEventArgs>(frame4.OnBackKeyPress);
}
JournalEntry.SetNavigationContext(obj2, new NavigationContext (UriParsingHelper.InternalUriParseQueryStringToDictionary(asyncState.Uri, true)));
obj2.SetValue(NavigationServiceProperty, this);
this.CompleteNavigation(obj2, asyncState.Mode);
}
}
catch (Exception exception)
{
if (this.RaiseNavigationFailed(uriBeforeMapping, exception))
{
throw;
}
}
}

¼ÓÔØÍê³Éºó£¬´ÓresultÖлñµÃPhoneApplicationPage¶ÔÏó£¬Ò²¾ÍÊÇ֮ǰ¼ÓÔØµÄXAMLÎļþ¡£È»ºóÉèÖÃÁ˵¼º½µÄContextÄÚÈÝ£¬Õâ¸öÓÃÀ´Ò³Ãæ¼ä´«ÖµµÄ¡£½ÓÏÂÀ´ obj2.SetValue(NavigationServiceProperty, this)·½·¨ÉèÖÃÁËNavigationServicePropertyÒÀÀµÊôÐÔ¡£Õâ¸öÊôÐԺ͵¼º½Ê±µÄ¿ÕÒýÓÃÒì³£Óйء£¶ø CompleteNavigation·½·¨ÓÃÀ´Íê³Éµ¼º½¡£

this.RaiseNavigated(content, uriBeforeMapping, mode, null != existingContentPage, existingContentPage, newContentPage);

ÆäÖÐÒ»¶Î´úÂëRaiseNavigated³ö·¢ÁËFrameµÄNavigatedʼþ£¬Ò²¾ÍÊÇ»áÖ´ÐÐÎÒÃÇÔÚAppÖеÄCompleteInitializePhoneApplication·½·¨¡£´ËʱÎÒÃÇÒѾ­»ñµÃÁËÒªÏÔÊ¾Ò³ÃæµÄPage¶ÔÏó¡£

ÎÒÃÇÖªµÀÔÚWPFÖÐÓжÔÏóÊ÷ºÍ¿ÉÊÓÊýµÄ¸ÅÄ¶øÔÚSilverlightÉÏÖ»ÓжÔÏóÊ÷¡£ RootVisualÊôÐÔÊÇÉèÖÃÏÔʾµÄÔªËØ£¬°ÑFrameÉèÖÃΪRootVisual£¬´Ëʱ¾Í»á°ÑFrame¼ÓÔØµ½¶ÔÏóÊ÷ÉÏ£¬¶øÇ°ÃæÌáµ½¹ý£¬Frame³õʼ»¯Ê±°ó¶¨ÁËLoadedʼþ£¬Õâ¸öʼþ´Ëʱ»á±»Ö´ÐС£

private void Frame_Loaded(object sender, RoutedEventArgs e)  
{
this.Load();
}

ʵ¼ÊÉÏËýÖ´ÐеÄÒ²ÊÇLoad·½·¨£¬Õâ¸ö·½·¨ÒѾ­ÔÚPhoneApplicationFrameµÄ¹¹Ô캯ÊýÖÐÖ´ÐйýÁË£¬ÓÐ_loaded×ֶαê¼Ç£¬Ò²¾Í²»»áÔÚÖ´ÐÐÁË¡£

public UIElement RootVisual  
{
get
{
return (XcpImports.Application_GetVisualRoot() as UIElement);
}
[SecuritySafeCritical]
set
{
XcpImports.CheckThread();
if ((value == null) || !XcpImports.DependencyObject_IsPointerValid(value))
{
throw new InvalidOperationException(Resx.GetString("Application_InvalidRootVisual"));
}
XcpImports.Application_SetVisualRoot(value);
this._rootVisual = value;
}
}

RootVisualµÄʵÏÖ¿´²»µ½£¬ÕâÀïÌùµÄÊÇSilverlightµÄʵÏÖ¡£ÕâÀïÓõ½ÁËXcpImports£¬Õâ¸ö¶ÔÏóÉÏһƪÎÄÕ½éÉܹýÁË£¬×îÖÕÊÇʹÓÃCore presentation frameworkµÄ·½·¨ÉèÖÃÁËRootVisual£¬Í¨¹ýFrameµÃµ½µ±Ç°µÄPage£¬ÕâʱPresentation Core»á¸ù¾Ýµ±Ç°µÄ¶ÔÏóÊ÷Éú³ÉÏÔ¿¨¿ÉÒÔʶ±ðµÄÈý½ÇÐΣ¬×îÖÕÏÔʾµ½ÆÁÄ»ÉÏ¡£Õâ·½ÃæÄÚÈÝ¿ÉÒԲο¼WPF Presentation

ËÄ PhoneApplicationPageºÍNavigateService

Ç°Ãæ½éÉÜÁËFrame¿ò¼ÜµÄ³õʼ»¯ºÍµÚÒ»¸öÒ³Ãæµ¼º½¼ÓÔØµ½ÏÔʾµÄ¹ý³Ì¡£ÎÒÃÇÒѾ­ÖªµÀ£¬Êµ¼Ê¸ºÔðÒ³Ãæµ¼º½µÄÊÇNavigateServiceÕâ¸öÀà¡£µ«Ö»ÓÐʹÓÃÁËFrame¿ò¼Ü²ÅÄÜÍê³Éµ¼º½¡£¶øÔÚPhoneApplicationPageÖÐÓÐÒ»¸öNavigateServiceÊôÐÔ£º

internal static NavigationService GetNavigationService(DependencyObject dependencyObject)  
{
Guard.ArgumentNotNull(dependencyObject, "dependencyObject");
return (dependencyObject.GetValue(NavigationServiceProperty) as NavigationService);
}

Ëûʵ¼ÊÊÇ·µ»ØÁËNavigationServicePropertyÒÀÀµÊôÐÔ¡£¶øÕâ¸öÊôÐÔÉÏÃæÌáµ½¹ý£¬ÊÇÔÚ³õʼ»¯Ê±¼Ó£¬BeginLoad¼ÓÔØÁËXAMLºóµÄ»Øµ÷º¯ÊýÖÐÉèÖÃÁË´ËÊôÐÔ¡£ËùÒÔÎÒÃÇ¿ÉÒÔÔÚPageÀàÖÐʹÓÃÏÂÃæ´úÂë½øÐе¼º½£¬Ò²¿ÉÒÔ»ñµÃAppÀàµÄRootFrame¶ÔÏóÀ´µ¼º½¡£

this.NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative));  

(Application.Current as App).RootFrame.Navigate(new Uri("/Page1.xaml", UriKind.Relative));

ÁíÍâÎÒÃÇÔÚPageÖл¹ÓÐOnNavigateToºÍOnNavigateFromµÈ·½·¨£¬À´¿ØÖƵ¼º½¡£ÕâЩÄÚÈݽ«ÔÚÏÂһƪÎÄÕÂÖнéÉÜ¡£

Îå SilverlightµÄ²»Í¬Ö®´¦

ͬWindows Phoneµ¼º½²»Í¬£¬ÎÒÃÇĬÈϽ¨Á¢Ò»¸öSilverlightµÄÆÕͨÏîÄ¿ÊÇûÓÐÌí¼ÓFrame¿ò¼ÜµÄ¡£ÎÒÃÇ¿ÉÒÔ·ÂÕÕWindows PhoneÐÞ¸ÄAppÎļþ¡£

private void Application_Startup(object sender, StartupEventArgs e)  
{
RootFrame = new Frame();
RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
this.RootVisual = RootFrame;
}

ÔÚ³ÌÐòÆô¶¯µÄʱºòÖ´ÐУ¬Õû¸ö¹ý³ÌºÍÇ°Ãæ»ù±¾Ò»Ñù¡£Ïà±ÈWindows Phone£¬ËûÃǵĹ¹Ô캯Êý¼òµ¥Á˺ܶࡣ

public Frame()  
{
base.DefaultStyleKey = typeof(Frame);
base.Loaded += new RoutedEventHandler(this.Frame_Loaded);
this._navigationService = new NavigationService(this);
}

internal NavigationService(Frame nav)
{
this._cacheRequiredPages = new Dictionary<string, Page>();
Guard.ArgumentNotNull(nav, "nav");
this._host = nav;
}

FrameÖÐ×¢²áÁËLoadedʼþ£¬ºÍWP²»Í¬µÄÊÇûÓÐÔÚFrameµÄ¹¹Ô캯ÊýÖоÍÖ´ÐС£ÄÇôËûÖ»ÄÜÔÚÒªÏÔʾµÄʱºòÔËÐУ¬Ò²¾ÍÊÇÎÒÃÇÉèÖÃÁËRootVisualÊôÐÔºó²ÅÄÜÖ´ÐÐNavigate·½·¨¡£ÁíÍâûÓÐÅäÖÃÎļþÉèÖõ¼º½³õʼ»­Ã棬ËùÒÔÎÒÃÇÒ²±ØÐëÔÚÕâÀïµ÷ÓÃNavigate·½·¨»òÉèÖÃSourceÊôÐÔ¡£

µ±Ò³Ã濪ʼ³ÊÏÖ£¬¼ÓÔØÁËFrameµ½¶ÔÏóÊ÷ºó´¥·¢ÁËLoadedʱ¼ä£¬ ×îÖÕµ÷ÓÃÁËNavigateService.Navigate·½·¨¡£

public bool Navigate(Uri source)  
{
return this.NavigateCore(source, NavigationMode.New, false, false);
}

ÕâÀïÒ²ºÍWindows Phone²»Í¬£¬NavigateServiceÖÐÖ±½Óµ÷ÓÃÁËNavigateCore·½·¨¡£´Ë·½·¨ÊµÏÖºÍWindows PhoneÒ»Ñù£¬´Ë·½·¨ÖÐÓÐÓõÄÊÇNavigateCore_StartNavigation£¬×îÖÕÊÇͨ¹ýµÄthis._contentLoader.BeginLoadÀ´Íê³ÉµÄ¡£È»ºóÏÔʾºËÐİѼÓÔØµÄÒ³ÃæÏÔʾµ½ÆÁÄ»ÉÏ¡£

ÒÔÉÏÊÇSilverlightµÄ¹ý³Ì£¬Ïà±ÈWindows Phone¼òµ¥Ò»Ð©¡£ÒòΪLoadedʼþ´¥·¢µÄʱ¼ä²»Í¬£¬ËùÒÔWP»á×Ô¶¯¸ù¾ÝÅäÖÃÎļþÉèÖÃÔÚApp¶ÔÏó½¨Á¢ºó¾Íµ¼º½µ½Ö¸¶¨Ò³Ã棻¶øSLÊÇÔÚ¼ÓÔØ¶ÔÏó×¼±¸³ÊÏÖʱ´¥·¢£¬¶øÇÒûÓÐÅäÖÃÎļþ£¬ËùÒÔ±ØÐëÊÖ¶¯ÉèÖÃһϡ£ÕâÒ²¾Í½âÊÍÁËÎÒÃÇǰһƪµÄÒÉÎÊ¡£Ò²ÊÇΪʲôSLÄ£·ÂWPÀ´´´½¨¿ò¼Ü£¬È´²»ÄÜÔÚNavigatedʱ¼äÖвÅÉèÖÃRootVisual¡£ÒòΪ´ËʼþÐèÒªÉèÖÃÔËÐÐÁËLoaded·½·¨²ÅÄÜ´¥·¢¡£

Áù ×ܽá

±¾ÎÄÖ÷Òª¶Ôµ¼º½¿ò¼ÜÔ´´úÂë½øÐÐÁ˼òµ¥µÄ½âÎö£¬Á˽âÁ˳ÌÐòÆô¶¯ºóµ¼º½µ½µÚÒ»¸ö½çÃæµÄ¹ý³Ì¡£Ê×ÏÈ´´½¨ÁËPhoneApplication¶ÔÏó£¬Ôڴ˶ÔÏó¹¹½¨Íê³Éºó£¬µ÷ÓÃÁËFrameµÄLoaded·½·¨À´µ¼º½µ½ÅäÖÃÎļþÖ¸¶¨µÄURI£»È»ºó¼ÓÔØ´ËXAMLÎļþ£¬È»ºó´¥·¢FrameµÄNavigated·½·¨ÉèÖÃRootVisual£¬´ËÊôÐÔ»áµ÷ÓÃÏÔʾ¿ò¼ÜµÄNative·½·¨£¬½«¶ÔÏóÊ÷³ÊÏÖµ½ÆÁÄ»ÉÏ¡£

   
1633 ´Îä¯ÀÀ       28
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ