在WPF中的另一个控件中查找控件

时间:2011-12-30 06:37:36

标签: c# wpf hyperlink

由于WPF中没有链接按钮,我使用超链接和文本块控件创建了一个链接按钮。

有3个控件:

<TextBlock  Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Left"  >                
     <Hyperlink Name="hyplnkIsActiveMarkets"  Click="hyplnkIsActive_Click" Foreground="Blue"  >  
         <TextBlock Name="txtblkIsActiveMarkets" Text="Active"  />     
     </Hyperlink>
 </TextBlock>
 <TextBlock  Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left">                
     <Hyperlink Name="hyplnkIsActiveBudgets"  Click="hyplnkIsActive_Click" Foreground="Blue"  >  
         <TextBlock Name="txtblkIsActiveBudgets"  Text="Active"  />     
     </Hyperlink>
</TextBlock>
<TextBlock  Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Left">                
     <Hyperlink Name="hyplnkIsActivePrograms"  Click="hyplnkIsActive_Click" Foreground="Blue"  >  
         <TextBlock Name="txtblkIsActivePrograms"  Text="Active"  />     
     </Hyperlink>
</TextBlock>

所有链接按钮都调用相同的点击方法

private void hyplnkIsActive_Click(object sender, RoutedEventArgs e)
{
    Hyperlink objHyperlink = (Hyperlink)sender;
    TextBlock objTextBlock = new TextBlock();

    if (objHyperlink == hyplnkIsActiveMarkets)
    {
        objTextBlock = txtblkIsActiveMarkets;
    }
    else if (objHyperlink == hyplnkIsActiveBudgets)
    {
        objTextBlock = txtblkIsActiveBudgets;
    }
    else if (objHyperlink == hyplnkIsActivePrograms)
    {
        objTextBlock = txtblkIsActivePrograms;
    }

    if (objTextBlock.Text == "Active")
        ChangeHyperLinkStatus(objHyperlink, objTextBlock, Status.Inactive);
    else ChangeHyperLinkStatus(objHyperlink, objTextBlock, Status.Active);
}

在click方法中,我使用if条件单独检查超链接内的文本块。

有没有更简单的方法呢?那基本上是在控制中找到控制权?

3 个答案:

答案 0 :(得分:2)

更新:您不能使用VisualTreeHelper.GetParent(...)来获取超链接的父级,因为您提到的超链接不是可视的。纠正了答案。

见下面的代码。

private void hyplnkIsActive_Click(object sender, RoutedEventArgs e)
{
    Hyperlink objHyperlink = (Hyperlink)sender;
    TextBlock objTextBlock  = (TextBlock)LogicalTreeHelper.GetChildren(objHyperlink)[0]; 
   // This will give logical tree first child of objHyperlink


    if (objTextBlock.Text == "Active")
        ChangeHyperLinkStatus(objHyperlink, objTextBlock, Status.Inactive);
    else 
        ChangeHyperLinkStatus(objHyperlink, objTextBlock, Status.Active);
}

请参阅有关logical tree on MSDN

的文章

答案 1 :(得分:1)

我认为你通过controls上的data而不是上的执行逻辑来转向错误的方向。

例如,您可以将ICommandRelayCommand绑定到按钮,或只订阅不同的事件,或定义自定义DataTemplate,其中鼠标按下所点击的控件是可分配的某些ModelView财产。

按照您的方式做,您在UI和执行逻辑之间创建了强大的耦合。 在这种情况下,更容易使用WindowsForm,然后使用WPF

答案 2 :(得分:0)

我终于明白了。感谢Maheep fa的帮助

 TextBlock objTextBlock = (TextBlock)LogicalTreeHelper.GetChildren(objHyperlink).Cast<System.Windows.Documents.InlineUIContainer>().FirstOrDefault().Child;