需求描述:

  给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("", string.Empty);
xe.Attributes["ImagePath0"].Value = imgPath0.Replace("", "");
images[].Source = new BitmapImage(new System.Uri(@"pack://application:,,," + xe.Attributes["ImagePath0"].Value));
}
else
{
xe.Attributes["ImagePath"].Value = imgPath0.Replace("", "");
xe.Attributes["ImagePath0"].Value = imgPath0.Replace("", "");
images[].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[] as Image;
Thread.Sleep();
}
_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("", string.Empty); if (!srcPath.Contains(""))
{
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[] as Image;
Thread.Sleep();
}
if (img != null )//&& !string.IsNullOrEmpty(_srcImgPath)
{
string srcPath = img.Source.ToString();
if (!srcPath.Contains("") && !srcPath.Contains("") && !srcPath.Contains(""))
{
int dotIndex = srcPath.LastIndexOf('.');
string imgExt = srcPath.Substring(dotIndex);
string newPath = srcPath.Substring(, srcPath.Length - imgExt.Length) + "" + 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
}

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

  1. WPF编游戏系列 之二 图标效果

    原文:WPF编游戏系列 之二 图标效果        本篇将要实现图标的两个效果:1. 显示图标标签,2. 图标模糊效果.在上一篇中提到Image没有HTML <img>的Title属性( ...

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

    Svn win7系统下状态图标不显示 Svn版本 tortoisesvn-1.8.8.25755-x64-svn-1.8.10.msi 2.不显示图标状态如图1,期望结果显示图标状态如图2 图1 图2 ...

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

    SVN是一款出色的代码版本控制工具,大部分开发者都在使用.由于前不久刚做了系统,所以要重装一下SVN,结果就出了问题,问题就是,不管是文件处于什么状态他的提示图标都不显示,这就太不给力了吧.通过搜寻, ...

  4. SVN状态图标消失的解决方法

    有些时候我们会发现我们的SVN状态图标会突然消失,所有的文件夹都变成了普通的文件夹格式,这点很不利于我们进行管理. 进入任意一个文件夹,鼠标右键,依次进入TortoiseSVN---Settings ...

  5. WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应

    WPF设置DataGrid行内容高度自适应  TextBox/TextBlock内容高度自适应  参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...

  6. TortoiseSVN文件夹及文件状态图标不显示解决方法

    win8 64位系统,原本svn是好用的,安装了klive金山快盘后,svn图标都不显示了.最后通过修改注册表解决: win+R调出运行框,输入regedit,打开注册表编辑器. HKEY_LOCAL ...

  7. WPF设置VistualBrush的Visual属性制作图片放大镜效果

    原文:WPF设置VistualBrush的Visual属性制作图片放大镜效果 效果图片:原理:设置VistualBrush的Visual属性,利用它的Viewbox属性进行缩放. XAML代码:// ...

  8. SVN 不显示状态图标--解决方法

    [SVN 不显示状态图标--解决方法] 在名字前面加空格, 三个六个空格随意: 参考:https://www.cnblogs.com/lzpong/p/6187366.html

  9. WPF 自定义MenuItem样式

    原文:WPF 自定义MenuItem样式 一.前言 默认的MenuItem样式比较普通,这次自定义MenuItem的样式也只是对MenuItem的颜色风格进行变化.需要其他功能的变化,大家可以根据样式 ...

随机推荐

  1. Aidl的使用步骤

    先说说Aidl传递参数类型 1.基本数据类型(除short类型) 2.String.charSequence 3.List,map 4.parcelable 第1步:定义一个*.aidl文件,ecli ...

  2. FK JavaScript:ArcGIS JavaScript类库加载不成功而导致的程序异常

    现象:页面加载时,有时候成功,有时候出错,出错的地方为init.js 加载esri的类库 经过仔细对比,发现出错时dojo加载的类库中,对象的很多属性都为undefined,而加载成功时,该对象的相关 ...

  3. Git分布式项目管理

          Git简介 Git是什么? Git和SVN一样都是一种高效的管理代码的系统. Git是目前世界上最先进的分布式版本控制系统(没有之一). 创建版本库 什么是版本库呢?版本库又名仓库,英文名 ...

  4. 当session过期后自动跳转到登陆页而且会跳出iframe框架

    写项目时在重定向后一直存在一个问题就是重定向后登陆页面会出现在跳出的子框架里.

  5. 【HDU4578 Transformation】线段树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题意:有一个序列,有四种操作: 1:区间[l,r]内的数全部加c. 2:区间[l,r]内的数全部 ...

  6. thinkphp打印执行的sql

    打印下执行的sql,也就是在执行add或save语句下面写下: echo M()->getlastsql();

  7. MySQL数据库初用(5.6版本)第一课

    参考:http://wenku.baidu.com/link?url=NlX55fDDQ02wESO1HNkxpvju2xATwe9Fym0MfojWddXbYaJcjEKKRF9z9EX4b7shV ...

  8. Docker Compose—简化复杂容器应用的利器

    Compose是用于定义和运行复杂Docker应用的工具.你可以在一个文件中定义一个多容器的应用,然后使用一条命令来启动你的应用,然后所有相关的操作都会被自动完成. 1. 安装Docker和Compo ...

  9. PHP关于依赖注入(控制反转)的解释和例子说明

    PHP关于依赖注入(控制反转)的解释和例子说明 发表于2年前(2014-03-20 10:12)   阅读(726) | 评论(1) 8人收藏此文章, 我要收藏 赞2 阿里云双11绽放在即 1111 ...

  10. mvc3升级mvc4的方法记录.

    手工升级ASP.NET MVC 3项目: 一.安装ASP.NET MVC 4 二.升级ASP.NET MVC版本配置信息: 1:替换项目 Web.config 中的 System.Web.Mvc, V ...