WPF:設置MenuItem多種不同狀態圖標


需求描述:

  給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;
        }
View Code

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
        }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM