在日常的工作生產中,經常會有將將生產數據或者一些信息主動推送給相關的管理人員,我們公司在開發WMS系統時,為了倉庫的儲存安全,需要在危廢品庫存達到一定的儲量時,自動通知倉管員去處理危廢品,所以就需要程式自動的通過企業微信告知倉管員,這個時候就需要用到企業微信的機器人了。 現在我所知道的企業微信機器人 ...
通常,導航意味著某個Control被添加到UI中,與此同時另一個Control被移除。
簡單跳轉
-
新建
UserControl
,新建ViewModel,VM需要實現INavigationAware
-
註冊
UserControl
到DryIoc容器
containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();
- 在XAML中需要導航的地方聲明Region
<ContentControl prism:RegionManager.RegionName="ContentRegion" />
- 在需要導航的地方(VM或後置代碼中)註入
IRegionManager
並請求導航(關於Prism
中的Region
可見我的另一篇隨筆)
public DelegateCommand<string> NavigateCommand { get; private set; }
public MainWindowViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
NavigateCommand = new DelegateCommand<string>(Navigate);
}
private void Navigate(string navigatePath)
{
if (navigatePath != null)
_regionManager.RequestNavigate("ContentRegion", navigatePath);
}
導航後執行回調
請求導航時可以添加一個回調方法用於導航成功後被使用
void RequestNavigate(
string regionName,
string source,
Action<NavigationResult> navigationCallback
);
一個例子:
private void Navigate(string navigatePath)
{
if (navigatePath != null)
_regionManager.RequestNavigate("ContentRegion", navigatePath, NavigationComplete);
}
private void NavigationComplete(NavigationResult result)
{
System.Windows.MessageBox.Show(String.Format("Navigation to {0} complete. ", result.Context.Uri));
}
被導航視圖的復用
每個能夠被導航的視圖的VM都需要實現 INavigationAware
介面,介面中有一個 IsNavigationTarget
方法,它用於表明當前視圖是否可以被導航復用,如果直接返回 true
,那麼導航時將總是使用同一個實例。
也可以根據條件返回 false
以使用新的VM實例。
被導航視圖的生命周期
當導航到新的視圖之後, 之前的視圖就成了deactive狀態。
可以通過實現 IRegionMemberLifetime
並重寫 KeepAlive
的 get
方法來自定義什麼情況下銷毀頁面,使每次頁面處於 deactivated
狀態時 ViewModel 對象被銷毀,再次導航到被銷毀頁面後重新創建新 ViewModel 對象。
public class ViewBViewModel : BindableBase, INavigationAware, IRegionMemberLifetime
{
public bool KeepAlive => false;
// ...
導航時攜帶參數
private void PersonSelected(Person person)
{
var parameters = new NavigationParameters();
parameters.Add("person", person);
if (person != null)
_regionManager.RequestNavigate("PersonDetailsRegion", "PersonDetail", parameters);
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
var person = navigationContext.Parameters["person"] as Person;
if (person != null)
SelectedPerson = person;
}
TabControl與Prism導航
在 TabControl
中聲明 RegionName
,在導航時會自動添加 TabPage
。