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;
        }

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 [email protected]}";
            //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 [email protected]}";
            //BaseUri    pack://application:,,,/DrawTool;component/startwindow.xaml    Unknown        System.Windows.Media.Imaging.BitmapFrameDecode
        }

时间: 2024-10-30 14:18:31

WPF:设置MenuItem多种不同状态图标的相关文章

解决svn状态图标不显示的办法

SVN是一款出色的代码版本控制工具,大部分开发者都在使用.由于前不久刚做了系统,所以要重装一下SVN,结果就出了问题,问题就是,不管是文件处于什么状态他的提示图标都不显示,这就太不给力了吧.通过搜寻,最后总结一下解决的办法. 确保SVN设置正确 右键->TortoiseSVN->setting->Icon Overlays->Status cache->default/Shell.none是不显示 如果装过360云盘百度云盘的解决方法 Windows Explorer She

Svn win7系统下状态图标不显示-转载

Svn win7系统下状态图标不显示 Svn版本 tortoisesvn-1.8.8.25755-x64-svn-1.8.10.msi 2.不显示图标状态如图1,期望结果显示图标状态如图2 图1 图2 3.在程序的文件夹下,右键--TortoiseSVN--Settings(设置)得到图1,然后弹出如图2所示对话框,点击Icon Overlays--Status cache,选择Shell--确定. 图1 图2 4.找到SVN安装包,双击打开SVN安装包,点击Next--选择Repair(修复)

WPF设置样式的几种方式

第一种方式是直接使用Setter来进行,可以对Background等进行设置. <Window.Resources> <Style TargetType="Button"> <Setter Property="Background" Value="Red"/> </Style></Window.Resources> 第二种是直接将比较复杂一点的Style放置到Window.Resourc

WPF 设置TextBox为空时,背景为文字提示。

<TextBox FontSize="17" Height="26" Margin="230,150,189,0" Name="txt_Account" VerticalAlignment="Top" Foreground="Indigo" TabIndex="0" BorderThickness="1"> <TextBox.Re

设置超链接在各种状态改变的样式颜色

设置超链接在各种状态改变的样式颜色,在html的<head>标签下面添加下面的样式,可以自己根据需要修改样式. <style> a:link {color:blue;} a:visited {color:blue;} a:hover {color:red;} a:active {color:yellow;} </style> a:link 表示未未访问的状态. a:visited 表示已访问过的状态. a:hover  表示鼠标移动到链接上时的状态. a:active 

Android设置壁纸和创建桌面图标

写了个小Demo,实现了设置壁纸和创建桌面图标的逻辑: 创建壁纸比较简单,将Drawable转为Bitmap,然后直接用setWallpaper就行了: Bitmap bitmap = BitmapFactory.decodeResource(Main.this.getResources(), R.drawable.wallpaper); try { Main.this.setWallpaper(bitmap); } catch (IOException e) { e.printStackTra

点击按钮之后将其设置为不可用状态

点击按钮之后将其设置为不可用状态:不少效果中,希望按钮只能够被点击一次,再点击之后就会被设置为不可用,代码非常的简单.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>点击按钮之后

.net 设置导航的当前状态

1. 动态获取地址栏的参数,在母版页 F7下设置: admin.Master.cs public partial class admin: System.Web.UI.MasterPage { public int menuId=0; protected void Page_Load(object sender, EventArgs e) { string url = Request.RawUrl.ToLower().Trim(); if (url.Contains("feedback.aspx

PIC16单片机设置不同IO口状态对功耗的影响

最近在做PIC单片机的低功耗,于是设置不同IO口状态测试了一下功耗情况,采用串联万用表的方式测量电流,单片机IO口为悬空状态,整个系统无外设驱动,测试采用的是PIC16F690单片机. 思路如下:系统上电后初始化所有的IO,然后进入调用系统函数SLEEP();进入休眠状态. 1. A.B.C端口全部为输入上拉:休眠后耗电500uA左右. 2. A.B.C端口全部为输入下拉:休眠后耗电500uA左右. 3. A.B.C端口全部为输出上拉:休眠后耗电2200uA左右. 4. A.B.C端口全部为输出