【问题标题】:Finding a control inside another control in WPF在 WPF 中的另一个控件中查找控件
【发布时间】:2011-12-30 06:37:36
【问题描述】:

由于 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);
}

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

有没有更简单的方法来做到这一点?这基本上是在控件中找到控件?

【问题讨论】:

  • 你可以使用 for 循环和检查控件
  • 这可能对你有帮助:WPF ways to find controls @ SO.
  • 括号内的 foreach (Control control in parent.Controls){ } 进行类型检查和/或强制转换

标签: c# wpf hyperlink


【解决方案1】:

更新:您不能使用 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的文章

【讨论】:

  • 我收到异常“'System.Windows.Documents.Hyperlink' 不是 Visual 或 Visual3D。”
  • 我没有找到 Hyperlink 的父级,我想要 Hyperlink 中的子级。但我没有找到子选项。
  • 他不是在问TextBlock 是Hyperlink 的孩子吗?
  • 皮奥特是对的。怎么可能找到孩子。我没有任何选择。
  • 是的。更新了获取孩子而不是父母的答案。
【解决方案2】:

我认为通过在controls 和 not 在data 上传递你的执行逻辑,你会走错方向。

例如,您可以将ICommand 或RelayCommand 绑定到按钮,或者只是订阅不同的事件,或者定义自定义DataTemplate,在鼠标按下时,单击的控件可分配给某个ModelView 属性.

以你的方式做事,你会在 UI 和你的执行逻辑之间建立严格的耦合。 在这种情况下更容易使用WindowsForm 然后WPF。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      相关资源
      最近更新 更多