none
Как найти CheckBox на WPF форме по его DisplayName? RRS feed

Ответы

  •         /// <summary>
            /// Finds a Child of a given item in the visual tree. 
            /// </summary>
            /// <param name="parent">A direct parent of the queried item.</param>
            /// <typeparam name="T">The type of the queried item.</typeparam>
            /// <param name="childName">x:Name or Name of child. </param>
            /// <returns>The first parent item that matches the submitted type parameter. 
            /// If not matching item can be found, a null parent is being returned.</returns>
            public static T FindChild<T>(this DependencyObject parent, string childName) where T : DependencyObject
            {
                // Confirm parent and childName are valid. 
                if (parent == null) return null;
    
                T foundChild = null;
    
                int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < childrenCount; i++)
                {
                    var child = VisualTreeHelper.GetChild(parent, i);
                    // If the child is not of the request child type child
                    T childType = child as T;
                    if (childType == null)
                    {
                        // recursively drill down the tree
                        foundChild = FindChild<T>(child, childName);
    
                        // If the child is found, break so we do not overwrite the found child. 
                        if (foundChild != null) break;
                    }
                    else if (!string.IsNullOrEmpty(childName))
                    {
                        var frameworkElement = child as FrameworkElement;
                        // If the child's name is set for search
                        if (frameworkElement != null && frameworkElement.Name == childName)
                        {
                            // if the child's name is of the request name
                            foundChild = (T)child;
                            break;
                        }
                    }
                    else
                    {
                        // child element found.
                        foundChild = (T)child;
                        break;
                    }
                }
    
                return foundChild;
            }

    • Предложено в качестве ответа PashaPash 20 марта 2012 г. 11:04
    • Помечено в качестве ответа CheeGer 21 марта 2012 г. 7:10
    20 марта 2012 г. 8:00
    Отвечающий

Все ответы

  • Здравствуйте.

    Под DisplayName вы подразумеваете текст чекбокса? Тогда нужно будет немного изменить алгоритм поиска из вариантов со stackoverflow.

    Возможно, если вы расскажите более подробно про задачу, которую решаете, то найдется более лучшее решение, чем искать через DisplayName.

    Также не забудьте отметить ответ, решающий проблему.

    Спасибо.


    Для связи [mail]

    20 марта 2012 г. 6:29
  • Мне нужно найти  и  отметить на форме чекбокс с заданным DisplayName или Name..

    пробовал так:

      var myCheckBox = (CheckBox)this.FindName("Name");
                myCheckBox.CheckState = CheckState.Checked;

    но вылетает эксепшн: ссылка на объект не указывает на экземпляр объекта.. 

    20 марта 2012 г. 6:53
  • > Как найти CheckBox на WPF форме
     
     
    обычно искать не требуется. просто в xaml для CheckBox указываете x:Name, напимер:
    <CheckBox x:Name="cb1" />
    в коде пишите, например:
    cb1.IsChecked = true;
     
     
    20 марта 2012 г. 6:54
  • CheckBox в xaml не прописан.. он добавляется на форму позже.. изначально форма пустая..
    20 марта 2012 г. 7:06
  • Так если он добавляется программно, то у вас и ссылка на него есть и проблем никак не должно быть.


    Для связи [mail]

    20 марта 2012 г. 7:39
  • В том то и дело что его добавляет очень мудрая логика и мне проще найти его на готовой форме чем пробраться к ссылке...  
    20 марта 2012 г. 7:50
  • > CheckBox в xaml не прописан.. он добавляется на форму позже.. изначально форма пустая..
     
     
    в такой ситуации можно использовать XamlReader.Parse и FrameworkElement.FindName.
    примерно так: 
     

    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="500" Width="500">
        <StackPanel>
            <Button Content="dialog" HorizontalAlignment="Left" VerticalAlignment="Top" Click="Button_Click" />
            <StackPanel x:Name="sp"></StackPanel>
        </StackPanel>
    </Window>
    
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Markup;
    using System.Windows.Media;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                var pc = new ParserContext();
                pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
                pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
                var o = (StackPanel) XamlReader.Parse(@"
                    <StackPanel>
                        <TextBox /> 
                        <CheckBox x:Name='cb1' />
                    </StackPanel>", 
                    pc);
                var c = (CheckBox) o.FindName("cb1");
                c.Background = Brushes.Red;
                sp.Children.Add(o);
            }
        }
    }
    


          
    20 марта 2012 г. 7:58
  •         /// <summary>
            /// Finds a Child of a given item in the visual tree. 
            /// </summary>
            /// <param name="parent">A direct parent of the queried item.</param>
            /// <typeparam name="T">The type of the queried item.</typeparam>
            /// <param name="childName">x:Name or Name of child. </param>
            /// <returns>The first parent item that matches the submitted type parameter. 
            /// If not matching item can be found, a null parent is being returned.</returns>
            public static T FindChild<T>(this DependencyObject parent, string childName) where T : DependencyObject
            {
                // Confirm parent and childName are valid. 
                if (parent == null) return null;
    
                T foundChild = null;
    
                int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < childrenCount; i++)
                {
                    var child = VisualTreeHelper.GetChild(parent, i);
                    // If the child is not of the request child type child
                    T childType = child as T;
                    if (childType == null)
                    {
                        // recursively drill down the tree
                        foundChild = FindChild<T>(child, childName);
    
                        // If the child is found, break so we do not overwrite the found child. 
                        if (foundChild != null) break;
                    }
                    else if (!string.IsNullOrEmpty(childName))
                    {
                        var frameworkElement = child as FrameworkElement;
                        // If the child's name is set for search
                        if (frameworkElement != null && frameworkElement.Name == childName)
                        {
                            // if the child's name is of the request name
                            foundChild = (T)child;
                            break;
                        }
                    }
                    else
                    {
                        // child element found.
                        foundChild = (T)child;
                        break;
                    }
                }
    
                return foundChild;
            }

    • Предложено в качестве ответа PashaPash 20 марта 2012 г. 11:04
    • Помечено в качестве ответа CheeGer 21 марта 2012 г. 7:10
    20 марта 2012 г. 8:00
    Отвечающий
  • Этот код у меня просто добавляет новый чекбокс на форму.. я так понял чтоб он работал мне нужно знать точное место в xaml где будет прописан нужный чекбокс? 
    20 марта 2012 г. 9:37
  • А здесь я не понял как преобразовать DependencyObject в CheckBox...
    20 марта 2012 г. 9:38
  • Это метод-расширение. Используется так:

    var checkbox = checkBoxContainerControl.FindChild<CheckBox>("CheckBoxName");

    20 марта 2012 г. 10:22
    Отвечающий
  • Можно попробовать использовать вот эту искалку. Если в качестве старта для поиска задать форму, то функция должна вернуть ваш CheckBox.

    Влюблен в WPF Не пишу на C#

    20 марта 2012 г. 10:36
    Отвечающий
  • Перепробовал все предложенные варианты.. везде вылетает - ссылка на объект не указывает на экземпляр объекта.. может как-нибудь по типу попробовать сначала хоть один чекбокс найти? 
    20 марта 2012 г. 15:11