需求描述:

  给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. Hbuider 同步github

    别人的教程,仅作收藏. http://blog.csdn.net/u011871921/article/details/44238971

  2. 8点需要注意的Web编程小细节

  3. java类加载器的层次结构

    类加载器的层次结构: 引导类加载器(bootstrap class loader) 用来加载java的核心库(JAVA_HOME/jre/lib/rt.jar,或sun.boot.class.path ...

  4. 【转】Linux安装方法一(U盘引导)

    Ubuntu 13.04正式版已经在4月25日发布了,相信很多人和我一样很想安装体验一下,但是现在的Ubuntu 13.04文件已经是794M,但是很难刻录到一张CD中,所以采用U盘启动安装Ubunt ...

  5. request实现页面包含

    package cn.itcast.request; import java.io.IOException; import javax.servlet.ServletException; import ...

  6. js == 判断

    根据阮一峰介绍的算法文章分12部分可判断: 如果x不是正常值(比如抛出一个错误),中断执行. 如果y不是正常值,中断执行. 如果Type(x)与Type(y)相同,执行严格相等运算x === y. 如 ...

  7. react-native win7环境搭建

    时间:2016-08-22 晚,西安 1.安装jdk java version "1.6.0_45"Java(TM) SE Runtime Environment (build 1 ...

  8. Day8~11(2016/1/28~2016/1/31)

    高估了自己的能力,先看UI再说吧…… 控件基本上看完了,layout明日再战

  9. Day3~Day7(2016/1/23~2016/1/27)

    活动的生命周期:onCreate();onStart();onResume();onPause();onStop();onDestroy();onRestart(); 活动的启动模式:standard ...

  10. 小谈pointer和relation

    在apicloud的数据库中,pointer和relation是在很难让人理解. 通过不断的实践,终于有点明白了. pointer和relation作用:在nosql数据库中实现表之间的关联 首先来说 ...