Как получить элемент, определенный в MenuItem.Шаблон из исходного кода?

#c# #wpf #visual-studio-2013

#c# #wpf #visual-studio-2013

Вопрос:

Я хочу получить элемент управления «textBoxLatitde» в исходном коде.

 <Image Name="icon">
 <ContextMenu>
      <MenuItem>
           <MenuItem.Template>
             <ControlTemplate>
              <Grid>
               <TextBlock Name="placeHolderText" Text="Lat :"/>
               <TextBox  Name="textBoxLatitde" />                    
              </Grid>
             </ControlTemplate>
          </MenuItem.Template>
     </MenuItem>
</ContextMenu>
  

Комментарии:

1. Вы можете получить объект templete из некоторого элемента управления. Но я с

2. Но я не рекомендую. Потому что это так сложно и грязно. Если вы можете добавить какое-либо событие пользовательского интерфейса в сетку, вы можете использовать элемент управления sender как конкретный тип. И вы также можете получить элементы управления siblings.

Ответ №1:

Попробуйте это:

 Grid grid = (icon.ContextMenu.Items[0] as MenuItem).Template.LoadContent() as Grid;
TextBox textBox = grid.Children[1] as TextBox;
  

Ответ №2:

Вы должны получить доступ к ContextMenu шаблонам сразу после его загрузки. Итак, добавьте этот код в конструктор вашего Window :

 icon.ContextMenu.Loaded  = new RoutedEventHandler(ContextMenuLoaded);
  

Затем добавьте этот метод к тому же Window :

 private void ContextMenuLoaded(object sender, RoutedEventArgs e)
{
    ContextMenu contextMenu = sender as ContextMenu;
    MenuItem menuItem = contextMenu.Items[0] as MenuItem;
    TextBox textBox = menuItem.Template.FindName("textBoxLatitde", menuItem) as TextBox;

    textBox.Text = "Some text";
}
  

Просто помните, что a ContextMenu загружается и выгружается каждый раз, когда вы его открываете / закрываете.