需求描述:

  给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. zk FileUpload(文件上传)

    <button label="上传 Image" upload="true,maxsize=1073741824"> <attribute n ...

  2. backbone学习笔记一

    backbone是一个MVC单页面框架,针对传统的WEB开发B/S架构的缺点,即通过表现层的浏览器,功能层的WEB服务器,数据层的数据库服务器构架,而操作渲染过程太过复杂.

  3. [转]linux 查看系统信息命令

    linux 查看系统信息命令是linux初学者必备的基础知识, 这些命令也非常有用, 因为进入linux第一件事就可能是首先查看系统信息, 因此必要的系统的学习一下这些linux系统信息命令还是非常有 ...

  4. oracle initialization or shutdown in progress问题解决步骤

        今天像往常一样打开电脑,启动plsql工具连接数据库,但是尽然连接不了,报了“oracle initialization or shutdown in progress”的提示信息,从操作系统 ...

  5. iOS no visible @interface for 'UIButton' declares the selector errors

    no visible @interface for 'UIButton' declares the selector errors  原理不是特别理解,通过清理缓存,代码更新了,Xcode还是读旧的缓 ...

  6. JS判断客户端系统 让ipad iphone 等手持设备自动跳到手机版

    if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iPad)/i))) { location.replace("http:// ...

  7. 安装SSD固态硬盘

    满足三个要求:开启AHCI."4K对齐".SSD初始化. 1. 开启AHCI模式 重启,进入bios,高级模式,SATA模式选择,选择AHCI. 2. 4K对齐 第3步,在分区的时 ...

  8. How to generate ssh key only for github and not conflict with original key

    3 生成SSH公钥 $ ssh-keygen -t rsa -C "your_email@youremail.com"  #ssh-keygen -t dsa -C "y ...

  9. iOS应用架构谈 网络层设计方案

    网络层在一个App中也是一个不可缺少的部分,工程师们在网络层能够发挥的空间也比较大.另外,苹果对网络请求部分已经做了很好的封装,业界的AFNetworking也被广泛使用.其它的ASIHttpRequ ...

  10. iOS:搭建本地的服务器

    一.介绍 作为一个专业的程序员,不管你是前端还是移动端或者是后台,能够自己试着搭建一个本地的服务器还是很有必要的,有的时候,我们可以自己测试一些数据,很方便开发.其实,mac是自带有本地的服务器的,用 ...