**----拓展用GearedValues的集合 處理livechart的速度 會比ChartValue集合的速度優化會好很多
IOC是什么;
IOC 不是適應誰 是一種工具 是一個容器 中文名:控制反轉 =>需要什么對象,就創建什么對象
Prism版本問題:
Prism從8.0開始大變化 Prism有兩個 wpf的IOC容器 Prism.DryIoc / Prism.Unity 一個項目中選擇其中的一個
DryIoc 比 Unity 性能高一點
Prism.Core:是Prism的主要核心代碼(與UI框架無關)
Prism.WPF:(跟UI層相關 表現層)
Prism.Unity(IOC 容器 選擇Unity) 如果選擇DryIoc IOC容器 那就是選擇Prism.DryIoc
安裝Prism框架
第一步
NuGet上面安裝 上面三個 Prism.Core 以及 Prism.WPF 還有 選擇的IOC容器 在這邊使用Unity
第二步
在APP.Xaml 那邊 xmlns:prism="http://prismlibrary.com/" 之后 將 原本的 <APPlication APPlication/> 改造成為
<prism:PrismApplication><prism:PrismApplication/> 之后刪除StartupURi 因為要在別的地方啟動主頁面程序
第三步
在APP.Xaml.cs 將繼承的Application 替換成 PrismApplication 並且 實現抽象類
會有兩個實現的 CreateShell() 以及RegisterTypes(IContainerRegistry containerRegistry) 兩個方法
還有一個特殊的方法 可以用來做登錄頁面的時候使用 可以在注冊完MainWindow之前 可以先打開一個頁面
protected override void InitializeShell(Window shell)
{
if(Container.Resolve<LoginView>().ShowDialog()==false)
{
Application.Current?.Shutdown();
}
else
base.InitializeShell(shell);
}
兩個方法的解釋:
CreateShell() : 創建一個 入口窗口程序 //起始窗口
protected override Window CreateShell()
{
//為了滿足 對象的實例注入
return Container.Resolve<MainWindow>();
}
RegisterTypes(IContainerRegistry containerRegistry)
用來注冊 頁面 還有 加入到 IOC容器里面的 東西
##########################################
Prism框架的基礎使用 Views 與 ViewModel 的相互綁定
第一步:在建立相互綁定之前 需要在View窗口 那邊 引用命名空間
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True" // 在我們的項目里面 按照特定的規則(需要名字View的全程+ViewModel) 將我們的ViewModel 注入到我們的View里面來
第二步 :目錄約定: 創建 一個 Views文件夾 以及ViewModels文件夾
將對應的View 以及 對應ViewModel 放入其中
命名約定: ViewModels 內的ViewModel 名字 必須是對應的View的名字 + ViewModel
例如: Views=> MainWindow ViewModels=>MainWindowViewModel 這樣才可以尋找到
MainWindowViewModel 中綁定的必須是屬性
第三步: 實現Viewmodel 的屬性改變后 UI層那邊也改變
需要繼承BindableBase
例如: private string _value;
public string Value
{
get { return _value; }
set { _value = value; }
}
需要變更為
private string _value ;
public string Value
{
get { return _value; }
set { SetProperty( ref _value, value);
}
}
使用里面的方法SetProperty() ( MVVMlight里面的 通知屬性類似)
也可以不只是單純的通知 View頁面的Value 也可以在SetProperty 通知另外一個屬性也變更
set { SetProperty( ref _value, value,"另外屬性值");// 特殊情況
第一步:綁定事件 實現Command 綁定
必須要一個 屬性 那個屬性必須是 ICommand類型的
例: public ICommand ClickCommand
{
get =>new DelegateCommand<object>("!!! 這邊需要一個 無返回值的方法用來實現Command的內容的方法 !!! ");;
}
並且這個方法 必須 new DelegateCommand<object> 是要擁有 object這個類型參數的 一個無返回值方法
例如: private void ClickButton(object a)
{
........
}
這個 object a 的值 會是 CommandParameter 綁定的參數 下面給的是 123 那這邊執行之后 這個 object a 就是123
前台在Button 上綁定Command
<Button Command="{Binding ClickCommand}"
CommandParameter="123" /> CommandParameter 綁定的給的事件參數
ObservesCanExecute 可以通過這個 來判斷按鈕的執行情況 當他返回false 的時候 我們綁定的這個按鈕 就不能執行//變灰了
例如:
public ICommand ClickCommand
{
get => new DelegateCommand<object>(ClickButton).ObservesCanExecute() => IsEnable);
}
還要在Value屬性那邊使用特殊重載 使用 ()=>{
this.IsEnable=Value!="";
};
例如: private bool _isEnable;
public bool IsEnable
{
get { return _isEnable; }
set { SetProperty(ref _isEnable, value); }
}