1

ビジュアル ツリー ヘルパーを使用して必要なオブジェクトを取得する方法について質問があります。次のようにメイン ページから呼び出す DialogItemControll というユーザー コントロールがあります。

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;}

これは、親の取得などを使用する私の試みを見ることができる場所です。あまりうまくできていません。だから私が欲しいのは、オブジェクト全体を次のようにすることです:

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ウィンドウはユーザーコントロールと同じで、サードパーティのコントロールです。オブジェクト全体を取得するためにツリー ヘルパーを適切に使用する方法を教えてください。

ありがとう

4

1 に答える 1

2

Linq To VisualTree を試す必要があります。

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

これにより、Linq スタイルの API を使用してビジュアル ツリーをクエリできます (実際には、Linq to XML と非常によく似ています)。あなたの例では、特定のタイプの子孫を見つけたいと考えています。これは次のように行うことができます。

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

クエリの最初の部分は、特定の型のクエリ対象要素のすべての子孫を検索し (Linq to VisualTree を使用して、子、ピアなどを検索することもできます...)、2 番目の部分は、返されたリストを特定の型にキャストします。指定された型の子孫は 1 つしかないことがわかっているので、Single() を使用して単一の項目を抽出できます。

それが役立つことを願っています。

于 2011-01-23T21:39:12.057 に答える