需求描述:

  给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. java.util.HashMap

    做LeeCode上的题目,发现关于数组的题目用HashMap后简化运算,包括在之前的工作中,也多次用到HashMap而我对它的了解却不多,现在来总结一下. 在算法中的用处,暂时的理解是,当数组中两个数 ...

  2. nodeType的返回

    <p id="one" title="one_one">one_one_one</p> 1.用getElementById var o ...

  3. HTML元素事件说明

    blur( ) 元素失去焦点 a, input, textarea, button, select, label, map, area change( ) 用户改变域的内容 input, textar ...

  4. POJ3468 线段树(区间更新,区间求和,延迟标记)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 97196   ...

  5. HTML--JS练习小游戏(别踩白块儿)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. WebApp 设计要素

    从去年开始就负责公司WebApp的产品跟设计工作,最近整体大改了两个版本,也算累积了一些实际的经验.在不断学习的过程中,发现对于WebApp可以直接用于项目上的资料比较零碎,在这里总结一下,供初做 W ...

  7. 安卓APP测试之使用Burp Suite实现HTTPS抓包方法

    APP的测试重点小部分在APP本身,大部分还是在网络通信上(单机版除外).所以在安卓APP测试过程中,网络抓包非常重要,一般来说,app开发会采用HTTP协议.Websocket.socket协议,一 ...

  8. javascript控制开始日期,和结束日期在同一个月

    /* * 控制开始日期,和结束日期 * 开始日期为当前月份,结束日期为当天 * 开始日期为之前月份,结束日期为最后一天 * @return string * @poseidon 2015-9-17 * ...

  9. stdout( 标准输出流)和 stderr( 标准输入流) 重定向问题

    我想把提示信息和错误信息列表都写入到同一个文件里, /* ** 设置流, 使输出与错误流都指向指定的文件 */ if( (output1 = freopen( PATH, "a", ...

  10. rbd命令

    chen@admin-node:~$ rbd --help usage: rbd [-n <auth user>] [OPTIONS] <cmd> ... where 'poo ...