Помогите с использованием визуального дерева в Silverlight - PullRequest
1 голос
/ 23 января 2011

У меня вопрос, как я могу использовать визуальный помощник по дереву, чтобы получить объект, который мне нужен. У меня есть пользовательский элемент управления 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;}

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

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 такое же, как пользовательский элемент управления, это просто сторонний элемент управления. Помогите, пожалуйста, как правильно использовать помощник по дереву, чтобы получить весь объект.

Спасибо

1 Ответ

2 голосов
/ 24 января 2011

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

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

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

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

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

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

...