【问题标题】:Help with using the visual tree in Silverlight帮助使用 Silverlight 中的可视化树
【发布时间】:2011-01-23 15:59:07
【问题描述】:

我有一个问题是如何使用可视化树助手来获取我需要的对象。 我有一个名为 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 窗口和用户控件一样,只是一个第三方控件。 请帮助我了解如何以一种好的方式使用树助手来获取整个对象。

谢谢

【问题讨论】:

  • 我可以通过这样写得到它: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 as DialogItemControll;但我正在寻找更好的方法来做到这一点。

标签: silverlight user-controls hierarchy visual-tree


【解决方案1】:

你应该试试 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 查找子节点、对等节点等...),第二部分将返回的列表强制转换为给定类型,最后因为我们知道给定类型只有一个后代,我们可以使用 Single() 来提取单个项目。

希望对您有所帮助。

【讨论】:

  • 谢谢,您一定喜欢 Linq,现在将它用于 sql、excel 和 xml.. 完美运行。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多