需求描述:
給MenuItem內部的子Image設置默認圖標(鼠標leave)、鼠標hover圖標、和選中時的圖標。
注:是給Menu內個別MenuItem修改,並且是彈出子菜單。
問題描述:
1)前提:Image綁定數據源成功,且Image設置默認圖標(鼠標leave)、鼠標hover圖標,已經在Image的對應事件中,通過image.source設置成功;
2)思路:在點擊彈出的子菜單項時,通過修改image綁定的數據源,來設置新選中圖標。
3)問題:修改image綁定的數據源成功,但圖標依然顯示的是默認圖標。
4)分析:
a、注銷掉在Image設置默認圖標(鼠標leave)、鼠標hover圖標的代碼,則點擊彈出的子菜單項時,設置新選中圖標成功。
b、釋放注釋,跟蹤點擊彈出的子菜單項時,image.source的值一直不是選中的新圖標。
c、釋放注釋,僅注釋掉給image.source的相關代碼,點擊彈出的子菜單項時,設置新選中圖標成功。跟蹤image.source的值是選中的新圖標。
5)結論:雖然修改image綁定的數據源成功,若存在給image.source 賦值操作,數據源並未起作用。
解決方法:
1、點擊彈出的子菜單項時,將image綁定的數據源設置為選中的圖標;
2、Image設置默認圖標(鼠標leave)、鼠標hover圖標時,不修改選中時顯示的圖標,僅在取消選中操作時,修改顯示的圖標;
3、點擊彈出的子菜單項時,不僅將image綁定的數據源設置為選中的圖標,而且獲取該Menuitem的Image,將image.source的值是選中的新圖標。
注:
操作的主體是數據源,其次才是控件,正常情況下控件的顯示是隨數據源變化。
參考代碼如下:
1、設置Menuitem內Image的圖片

/// <summary> /// 設置菜單項內的圖片(因為Image.source賦值后,顯示不出綁定的圖片,所以又重新賦值) /// </summary> /// <param name="mi"></param> /// <param name="isFlag"></param> /// <returns></returns> private bool SetMenuitemImage(System.Windows.Controls.MenuItem mi,bool isFlag) { bool isSuccess= false; try { if (mi != null) { XmlElement xe = mi.Header as XmlElement; string imgPath0 = xe.Attributes["ImagePath0"].Value;//front + List<Image> images = this.GetChildObjects<Image>(mi); if (!isFlag) { xe.Attributes["ImagePath"].Value = imgPath0.Replace("2", string.Empty); xe.Attributes["ImagePath0"].Value = imgPath0.Replace("2", "0"); images[0].Source = new BitmapImage(new System.Uri(@"pack://application:,,," + xe.Attributes["ImagePath0"].Value)); } else { xe.Attributes["ImagePath"].Value = imgPath0.Replace("0", "2"); xe.Attributes["ImagePath0"].Value = imgPath0.Replace("0", "2"); images[0].Source = new BitmapImage(new System.Uri(@"pack://application:,,," + xe.Attributes["ImagePath0"].Value)); } } } catch (Exception ex) { isSuccess = false; } return isSuccess; }
2、Image設置默認圖標(鼠標leave)、鼠標hover圖標時,不修改選中時顯示的圖標

private void MenuItemImage_MouseEnter(object sender, EventArgs e) { Image img = sender as Image; if (img == null && sender is StackPanel)//System.Windows.Controls.MenuItem)//StackPanel// { //System.Windows.Controls.MenuItem mi = sender as System.Windows.Controls.MenuItem; //StackPanel sp = mi.DataContext as StackPanel; StackPanel sp = sender as StackPanel; img = sp.Children[0] as Image; Thread.Sleep(10); } _logger.Info(sender.GetType().ToString()); if (img != null && string.IsNullOrEmpty(_srcImgPath)) { //_srcImgPath = img.Source.ToString(); //_logger.Info(_srcImgPath); string srcPath = img.Source.ToString(); string newPath = srcPath.Replace("0", string.Empty); if (!srcPath.Contains("2")) { img.Source = new BitmapImage(new System.Uri(newPath)); } } _imgFlag = true; //img.Source = new BitmapImage(new System.Uri("pack://application:,,," + _selectedXelmt.Attributes["ImagePath"].Value));// "{Binding XPath=@ImagePath0}"; //BaseUri pack://application:,,,/DrawTool;component/startwindow.xaml Unknown System.Windows.Media.Imaging.BitmapFrameDecode } private void MenuItemImage_MouseLeave(object sender, EventArgs e) { Image img = sender as Image; if (img == null && sender is StackPanel)//System.Windows.Controls.MenuItem) { //System.Windows.Controls.MenuItem mi = sender as System.Windows.Controls.MenuItem; //StackPanel sp = mi.DataContext as StackPanel; StackPanel sp = sender as StackPanel; img = sp.Children[0] as Image; Thread.Sleep(10); } if (img != null )//&& !string.IsNullOrEmpty(_srcImgPath) { string srcPath = img.Source.ToString(); if (!srcPath.Contains("0") && !srcPath.Contains("1") && !srcPath.Contains("2")) { int dotIndex = srcPath.LastIndexOf('.'); string imgExt = srcPath.Substring(dotIndex); string newPath = srcPath.Substring(0, srcPath.Length - imgExt.Length) + "0" + imgExt; img.Source = new BitmapImage(new System.Uri(newPath)); } //img.Source = new BitmapImage(new System.Uri(_srcImgPath)); _srcImgPath = string.Empty; //_logger.Info(_srcImgPath); } //Thread.Sleep(10); _imgFlag = false; _logger.Info(sender.GetType().ToString()); //img.Source = new BitmapImage(new System.Uri("pack://application:,,," + _selectedXelmt.Attributes["ImagePath"].Value));// "{Binding XPath=@ImagePath0}"; //BaseUri pack://application:,,,/DrawTool;component/startwindow.xaml Unknown System.Windows.Media.Imaging.BitmapFrameDecode }