• WPF:获取控件内的子项


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

    <Window>
        <Window.Resources>
    
            <!--工具数据源-->
            <XmlDataProvider x:Key="toolsDS" Source="ConfigToolsTools.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="38" Height="38" Margin="0,0,0,0" VerticalAlignment="Center" >
                    <Image  x:Name="img_menuIcon" MouseEnter="MenuItemImage_MouseEnter"  MouseLeave="MenuItemImage_MouseLeave"   Source="{Binding XPath=@ImagePath0}"   ><!--Width="38" Height="38"--></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="88" Height="26" Margin="-2,-2,-2,0" Background="#FF939393" BorderBrush="{x:Null}" Foreground="{x:Null}" BorderThickness="0"
                        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="20"></Image>
    
                <Button.Template>
                    <ControlTemplate TargetType="Button">
                        <Grid Background="#939393">
                            <Image x:Name="ImgOsCanvas" Source="/DrawTool;component/Images/铺展.png" Width="88" Height="20"></Image>
                        </Grid>
                    </ControlTemplate>
    
                </Button.Template>
    
            </Button>
            <!--<TextBlock Height="10" Margin="0,0,0,0" Background="#43464f">
            </TextBlock>-->
            <Menu x:Name="menuTools" ItemsSource="{Binding Source={StaticResource ResourceKey= toolsDS}}"  Background="Transparent" ></Menu>
             
        </StackPanel>
        
    </Window>
    View Code

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

            /// <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 = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
                {
                    child = VisualTreeHelper.GetChild(obj, i);
    
                    if (child is T)
                    {
                        childList.Add((T)child);
                    }
                    childList.AddRange(GetChildObjects<T>(child));
                }
                return childList;
            }  
    View Code

      如:获取Menu的所有MenuItem项

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

    三、更改菜单项内容

      1、简便的方式:

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

      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 = 0)
            {
                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 = 3;
                    DependencyObject dpdcyObj = VisualTreeHelper.GetChild(mi, 0);
                    switch (flag)
                    { 
                        case 0:
                            index = 3;
                            break;
                        case 1:
                            index = 2;
                            break;
                        default:
                            break;
                    }
                    DependencyObject dpdcyObj1 = VisualTreeHelper.GetChild(dpdcyObj, index);    //menuItem 1,   子项是2
                    DependencyObject dpdcyObj2 = VisualTreeHelper.GetChild(dpdcyObj1, 0);
                    DependencyObject dpdcyObj3 = VisualTreeHelper.GetChild(dpdcyObj2, 0);
                    DependencyObject dpdcyObj4_1 = VisualTreeHelper.GetChild(dpdcyObj3, 0);
                    DependencyObject dpdcyObj4_2 = VisualTreeHelper.GetChild(dpdcyObj3, 1);
                    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, 0);
                    DependencyObject dpdcyObj6 = VisualTreeHelper.GetChild(dpdcyObj5, 0);
                    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;
            }
    View Code
  • 相关阅读:
    (原创)系统架构设计-通用权限模型设计①
    (原创)项目部署-Tomcat设置默认访问项目及项目重复加载问题处理
    安装在CloudStack时CentOS6.4中安装MySQL通过mysql_secure_installation方式修改密码
    (原创)VM中的CentOS6.4中安装CloudStack6.3②
    (原创)VM中的CentOS6.4中安装CloudStack6.3①
    S2SH+mysql-软件开发实际部署问题-8个小时后提示MYSQL数据库无法连接
    转---B/S结构JavaEE WebApp的全自动安装包制作心得
    javaEE-----org.springframework.dao.InvalidDataAccessApiUsageException: Write operation
    监控服务器Java异常脚本
    StringUtils.isNumeric("")竟然返回true
  • 原文地址:https://www.cnblogs.com/shenchao/p/5522432.html
Copyright © 2020-2023  润新知