2011-01-23 2 views
1

У меня вопрос о том, как я могу использовать помощник визуального дерева для получения объекта, который мне нужен. У меня есть пользовательский проверочные под названием DialogItemControll, что я называю из моей главной странице, как это:Помогите с использованием визуального дерева в Silverlight

DialogItemControll ivDialogWindow = new DialogItemControll() 
      ivDialogWindow.ivSave.Click += new RoutedEventHandler(ivSave_Click); 
      ivDialogWindow.Show(); 

А потом у меня есть метод ivSave_Click, который вызывается при нажатии на кнопку Сохранить на моем пользователя проверочные. Этот метод выглядит так:

void ivSave_Click(object sender, RoutedEventArgs e) 
    { 
     var button = sender as Button; 
     var firstStack = button.Parent as StackPanel; 
     var secondStack = firstStack.Parent as StackPanel; 
     TextBox te = secondStack.FindName("ivUserComment") as TextBox;} 

Здесь вы можете увидеть мои попытки использовать родительский элемент get и т. Д. Не так красиво сделано. Так что я хочу, чтобы получить весь объект как:

var controll = ?? as DialogItemControll 

Мои DialogItemControll выглядит следующим образом:

<C1:C1Window x:Class="DialogItemControll" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:C1="clr-namespace:C1.Silverlight;assembly=C1.Silverlight" 
mc:Ignorable="d" 
d:DesignHeight="418" d:DesignWidth="401"> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <StackPanel Grid.Row="0" Margin="5,5,5,5"> 
     <TextBlock Name="ivHelpComment" FontSize="18">test</TextBlock> 
     <TextBox Name="ivUserComment" BorderThickness="2,2,2,2" Height="170"></TextBox> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" > 
      <Button Name="ivSave" HorizontalAlignment="Right" Height="22" Width="70" Margin="0,10,20,0" Click="ivSave_Click">Spara</Button> 
      <Button Name="ivCancel" HorizontalAlignment="Right" Height="22" Width="70" Margin="0,10,20,0" Click="ivCancel_Click">Avbryt</Button> 
     </StackPanel> 
    </StackPanel> 
</Grid> 

окно C1 такое же, как пользовательский элемент управления, его просто третья сторона контроль. Пожалуйста, помогите мне в том, как я должен использовать хелпер дерева, чтобы получить весь объект.

Благодаря

+0

Я могу получить его, написав: var button = sender as Button; var firstStack = button.Parent как StackPanel; var secondStack = firstStack.Parent как StackPanel; var thirdStack = secondStack.Parent as Grid; var lastItem = thirdStack.Parent как DialogItemControll; Но я ищу лучший способ сделать это. – Fore

ответ

2

Вы должны попробовать Linq To VisualTree:

http://www.scottlogic.co.uk/blog/colin/2010/03/linq-to-visual-tree/

Это позволяет запрашивать визуальное дерево с помощью API Linq стиль (Это на самом деле очень похож на Linq для XML). В вашем примере вы хотите найти Descendant определенного типа. Вы можете сделать это следующим образом:

var dialogItemControl = button.Descendants<DialogItemControll>() 
           .Cast<DialogItemControll>() 
           .Single(); 

Первая часть запроса находит все потомки запрашиваемых элемента данного типа (вы также можете использовать Linq для VisualTree, чтобы найти детей, коллег и т.д. ...), вторая часть возвращает возвращаемый список данному типу, потому что мы знаем, что есть только один потомок данного типа, мы можем использовать Single() для извлечения единственного элемента.

Надеюсь, что это поможет.

+0

Спасибо, тебе нужно полюбить Linq, теперь он использует его для sql, excel и xml .. Отлично работает. благодаря – Fore