一、界面内容(部分:仅供参考)

<Window>
<Window.Resources> <!--工具数据源-->
<XmlDataProvider x:Key="toolsDS" Source="Config\Tools\Tools.xml" XPath="Tools/Tool"></XmlDataProvider>
<!--Tool模板-->
<HierarchicalDataTemplate DataType="Tool" ItemsSource="{Binding XPath=Tool}" >
<StackPanel Orientation="Vertical" VerticalAlignment="Center" Margin="0,10,0,0" > <!--MouseEnter="MenuItemImage_MouseEnter" MouseLeave="MenuItemImage_MouseLeave"-->
<TextBlock Tag ="{Binding XPath=@Name}" Width="" Height="" Margin="0,0,0,0" VerticalAlignment="Center" >
<Image x:Name="img_menuIcon" MouseEnter="MenuItemImage_MouseEnter" MouseLeave="MenuItemImage_MouseLeave" Source="{Binding XPath=@ImagePath0}" ><!--Width="" Height=""--></Image>
</TextBlock>
<TextBlock x:Name="img_Title" Text ="{Binding XPath=@Title}" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center" Margin="0,3,0,0" Foreground="#FFD1D1D1" FontSize="{Binding XPath=@FontSize}" MouseEnter="MenuItemText_MouseEnter" MouseLeave="MenuItemText_MouseLeave" >
</TextBlock>
</StackPanel>
</HierarchicalDataTemplate> </Window.Resources> <StackPanel x:Name="StackBlist" Orientation="Vertical" MenuItem.Click="MenuItem_Click" VerticalAlignment="Top" Background="#43464f">
<Button x:Name="btnOS" Click="btnOS_Click" Width="" Height="" Margin="-2,-2,-2,0" Background="#FF939393" BorderBrush="{x:Null}" Foreground="{x:Null}" BorderThickness=""
PreviewMouseLeftButtonDown="StackBlist_PreviewMouseLeftButtonDown"
PreviewMouseLeftButtonUp="StackBlist_PreviewMouseLeftButtonUp" HorizontalAlignment="Center" VerticalAlignment="Center" Style="{x:Null}" IsEnabled="True" IsHitTestVisible="True" IsManipulationEnabled="False">
<!--PreviewMouseMove="StackBlist_PreviewMouseMove"-->
<Image x:Name="ImgOsCanvas" Source="/DrawTool;component/Images/铺展.png" Height=""></Image> <Button.Template>
<ControlTemplate TargetType="Button">
<Grid Background="#939393">
<Image x:Name="ImgOsCanvas" Source="/DrawTool;component/Images/铺展.png" Width="" Height=""></Image>
</Grid>
</ControlTemplate> </Button.Template> </Button>
<!--<TextBlock Height="" Margin="0,0,0,0" Background="#43464f">
</TextBlock>-->
<Menu x:Name="menuTools" ItemsSource="{Binding Source={StaticResource ResourceKey= toolsDS}}" Background="Transparent" ></Menu> </StackPanel> </Window>

二、获取元素的所有子元素

        /// <summary>
/// 获得指定元素的所有子元素
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public List<T> GetChildObjects<T>(DependencyObject obj) where T : FrameworkElement
{
DependencyObject child = null;
List<T> childList = new List<T>(); for (int i = ; i <= VisualTreeHelper.GetChildrenCount(obj) - ; i++)
{
child = VisualTreeHelper.GetChild(obj, i); if (child is T)
{
childList.Add((T)child);
}
childList.AddRange(GetChildObjects<T>(child));
}
return childList;
}

  如:获取Menu的所有MenuItem项

 List<System.Windows.Controls.MenuItem> mis = GetChildObjects<System.Windows.Controls.MenuItem>(this.menuTools);

三、更改菜单项内容

  1、简便的方式:

List<Image> images = GetChildObjects<Image>(mi);

  2、(比较笨的方法:按照ViasualTree图,一步步找的)

        /// <summary>
/// 设置菜单项的图标、标题
/// </summary>
/// <param name="mi">菜单项</param>
/// <param name="isConnected">是否已连接</param>
/// <param name="title"></param>
/// <param name="flag"></param>
/// <returns></returns>
private bool SetMenuContent(System.Windows.Controls.MenuItem mi,bool isConnected,string title = null,int flag = )
{
bool isSuccess = true;
try
{
XmlElement xe = mi.Header as XmlElement;
_selectedXelmt = xe;
string front = @"pack://application:,,,";
string menuItemTitle = xe.Attributes["Title"].Value;
string imgPath = front + xe.Attributes["ImagePath"].Value;
string imgPath0 = front + xe.Attributes["ImagePath0"].Value;
int index = ;
DependencyObject dpdcyObj = VisualTreeHelper.GetChild(mi, );
switch (flag)
{
case :
index = ;
break;
case :
index = ;
break;
default:
break;
}
DependencyObject dpdcyObj1 = VisualTreeHelper.GetChild(dpdcyObj, index); //menuItem 1, 子项是2
DependencyObject dpdcyObj2 = VisualTreeHelper.GetChild(dpdcyObj1, );
DependencyObject dpdcyObj3 = VisualTreeHelper.GetChild(dpdcyObj2, );
DependencyObject dpdcyObj4_1 = VisualTreeHelper.GetChild(dpdcyObj3, );
DependencyObject dpdcyObj4_2 = VisualTreeHelper.GetChild(dpdcyObj3, );
TextBlock tb = dpdcyObj4_2 as TextBlock;
if (isConnected && !string.IsNullOrEmpty(title))
{
tb.Text = title;
}
else
{
tb.Text = menuItemTitle;
}
//System.Windows.Forms.MessageBox.Show(tb.Text);
DependencyObject dpdcyObj5 = VisualTreeHelper.GetChild(dpdcyObj4_1, );
DependencyObject dpdcyObj6 = VisualTreeHelper.GetChild(dpdcyObj5, );
Image img = dpdcyObj6 as Image;
if (isConnected)
{
//string srcPath = img.Source.ToString().Replace("0", string.Empty);
//img.Source = new BitmapImage(new System.Uri(srcPath));
img.Source = new BitmapImage(new System.Uri(imgPath));
}
else
{
img.Source = new BitmapImage(new System.Uri(imgPath0));
}
//System.Windows.Forms.MessageBox.Show(img.ToString());
isSuccess = true;
}
catch (Exception ex)
{
isSuccess = false;
} return isSuccess;
}

WPF:获取控件内的子项的更多相关文章

  1. [WPF]获取控件间的相对位置

    原文:[WPF]获取控件间的相对位置 [WPF]获取控件间的相对位置                             周银辉 我们知道WPF有着比较灵活的布局方式,关于某个控件的坐标,Canv ...

  2. WPF获取控件的句柄

    在WinForm中,获得句柄是一件很容易的事情,This.Handle或者Control.Handle就可以,最近在WPF的开发中发现找不到这个属性,一番查找资料后找到了两种方式. 1,使用Windo ...

  3. WPF 获取控件模板中的控件

    DG是控件名称public T GetVisualChild<T>(DependencyObject parent, Func<T, bool> predicate) wher ...

  4. WPF获取控件内部的ScrollViewer,并控制ScrollViewer操作

    //获取内部  ScrollViewer方法 public static T FindVisualChild<T>(DependencyObject obj) where T : Depe ...

  5. WPF线程中获取控件的值和给控件赋值

    WPF中使用线程操作控件,按平常的操作方法操作的话会报异常:调用线程无法访问此对象,因为另一个线程拥有该对象.所以我们要使用Dispatcher类的BeginInvoke()与Invoke()方法.B ...

  6. WPF默认控件模板的获取和资源词典的使用

    一.获取默认的控件模板 WPF修改控件模板是修改外观最方便的方式,但是会出现不知道原来的控件的模板长什么样,或者想用来参考的,下面分享一下获取某控件默认控件模板的方式(已Button为例): 1.创建 ...

  7. WPF常用控件应用demo

    WPF常用控件应用demo 一.Demo 1.Demo截图如下: 2.demo实现过程 总体布局:因放大缩小窗体,控件很根据空间是否足够改变布局,故用WrapPanel布局. <ScrollVi ...

  8. asp.net js获取控件ID

    ClientID是由ASP.Net生成的服务器控件得客户端标识符,当这个控件生成到客户端页面的时候,在客户端代码访问该控件时就需要通过ClientID来访问. 以文本框为例: 一.未使用母版页 js可 ...

  9. WPF Image控件中的ImageSource与Bitmap的互相转换

    原文:WPF Image控件中的ImageSource与Bitmap的互相转换  1.从bitmap转换成ImageSource [DllImport("gdi32.dll", ...

随机推荐

  1. VS中查看/修改Dialog控件TAB顺序的方法

    打开资源视图,打开Dialog的编辑界面 查看: 格式>Tab键顺序 修改: 格式>Tab键顺序 用鼠标左键按你想要的顺序点击各个控件的TAB标签,就设定了 那些你想要TAB键能选择到的控 ...

  2. 查看python的路径

    >>> import sys >>> sys.path

  3. 数据块损坏(block corruption)

    分为物理损坏和逻辑损坏-物理损坏一般指数据块头部不可以访问.数据块校验值不合法,数据块格式不再是oracle承认的格式-逻辑损坏一般是在物理性结构完整的情况下,数据的内容在含义上不正确,比如保存了不允 ...

  4. 《30天自制操作系统》10_day_学习笔记

    harib07a: 整理内存管理函数:memman_alloc和memman_free能够以最小1字节进行内存管理,但时间久了后,容易产生外部碎片:为此,笔者编写了一些以0x1000字节为单位进行内存 ...

  5. CommonJS规范

    CommonJS是一种规范,NodeJS是这种规范的实现.CommonJS是一 个不断发展的规范,计划将要包括如下部分: Modules Binary strings and buffers Char ...

  6. Leetcode: UTF-8 Validation

    A character in UTF8 can be from 1 to 4 bytes long, subjected to the following rules: For 1-byte char ...

  7. nyist 597 完数?

    http://acm.nyist.net/JudgeOnline/problem.php?pid=597 完数? 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 一个 ...

  8. [原创]java WEB学习笔记84:Hibernate学习之路-- -映射 一对一关系 ,基外键的方式实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. 1021: A除以B

    1021: A除以B 时间限制: 1 Sec  内存限制: 128 MB提交: 263  解决: 189[提交][状态][讨论版] 题目描述 本题要求计算A/B,其中A是不超过1000位的正整数,B是 ...

  10. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...