How to Get element inside the content control

后端 未结 2 422
面向向阳花
面向向阳花 2021-01-13 17:01

I need to find the element inside the content control :



        
相关标签:
2条回答
  • 2021-01-13 17:29

    This method will help you:

    public T FindElementByName<T>(FrameworkElement element, string sChildName) where T : FrameworkElement
        {
                T childElement = null;
                var nChildCount = VisualTreeHelper.GetChildrenCount(element);
                for (int i = 0; i < nChildCount; i++)
                {
                    FrameworkElement child = VisualTreeHelper.GetChild(element, i) as FrameworkElement;
    
                    if (child == null)
                        continue;
    
                    if (child is T && child.Name.Equals(sChildName))
                    {
                        childElement = (T)child;
                        break;
                    }
    
                    childElement = FindElementByName<T>(child, sChildName);
    
                    if (childElement != null)
                        break;
                } 
                return childElement;
        }
    

    And, how I use it, just add button, and on button Click:

     private void Button_OnClick(object sender, RoutedEventArgs e)
        {
            var element = FindElementByName<ComboBox>(ccBloodGroup, "cbBloodGroup");
        }
    
    0 讨论(0)
  • 2021-01-13 17:47

    Basically, you need to provide an element that (as the error says) has the Template applied. Your ccBloodGroup control is inside the DataTemplate and so clearly, does not have this Template applied to it.

    For example, an element that might have this Template applied to it would be the ContentPresenters of the items in the YourChoices collection that are using this DataTemplate to define what they look like in the UI.

    You can find out full details as usual on MSDN, with a detailed example on the FrameworkTemplate.FindName Method page, but it goes something like this... from the example on the linked page:

    // Getting the currently selected ListBoxItem 
    // Note that the ListBox must have 
    // IsSynchronizedWithCurrentItem set to True for this to work
    ListBoxItem myListBoxItem = (ListBoxItem)(myListBox.ItemContainerGenerator.
        ContainerFromItem(myListBox.Items.CurrentItem));
    
    // Getting the ContentPresenter of myListBoxItem
    ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem);
    
    // Finding textBlock from the DataTemplate that is set on that ContentPresenter
    DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
    TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName("textBlock", 
        myContentPresenter);
    
    // Do something to the DataTemplate-generated TextBlock
    MessageBox.Show("The text of the TextBlock of the selected list item: "
    + myTextBlock.Text);
    

    The FindVisualChild method is shown on the linked page.

    0 讨论(0)
提交回复
热议问题