2011-01-23 4 views
1

ビジュアルツリーヘルパーを使用して、必要なオブジェクトを取得する方法について質問があります。 は、私はこのように私のメインページから呼び出すDialogItemControllというユーザーcontrollあります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 parentなどの使用を確認できる場所です。あまりうまくいきません。それでは、私が欲しいのようなオブジェクト全体を取得することです:

<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ウィンドウには、ユーザーコントロールと同じであり、そのわずか第三者:

var controll = ?? as DialogItemControll 

私DialogItemControllは、このようになりますコントロール。 オブジェクト全体を取得するには、ツリーヘルパーをどのように使用するのがいいか教えてください。

おかげ

+0

私はそれを書くことでそれを得ることができます:var button = sender as Button; var firstStack = button.Parent as StackPanel; var secondStack = firstStack.Parent as StackPanel; var thirdStack = secondStack.Parent(グリッド)。 var lastItem = thirdStack.ParentはDialogItemControllです。しかし、私はこれを行うより良い方法を探しています。 – Fore

答えて

2

あなたはVisualTreeへのLINQを試してみてください:これは、LINQのスタイルのAPIを使用してビジュアルツリーを照会することができます

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

(それが実際にXMLへのLINQに非常によく似ています)。あなたの例では、特定のタイプのDescendantを探したいと思っています。次のようにあなたがこれを行うことができます:

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

クエリの最初の部分は、特定のタイプの照会要素のすべての子孫を検索します(あなたも見つけることVisualTreeへのLINQを使用することができ、子供、同僚など)、 2番目の部分は返されたリストを指定された型にキャストします。最後に、指定された型の子孫が1つしかないことがわかっているので、Single()を使用して1つの項目を抽出できます。

希望に役立ちます。

+0

ありがとう、あなたはLinqを愛するようになりました。今はsql、excel、xml向けに使用しています。完全に動作します。ありがとう – Fore

関連する問題