后访问的UIElement在WPF

问题描述:

XAML加载我有一个Canvas从XAML负载被填充使用一个文件:后访问的UIElement在WPF

SBWindowContainerCanvas.Children.Clear();   
StreamReader stringreader = new StreamReader("C:\\xaml\\xmltest.xaml"); 
XmlReader xmlreader = XmlReader.Create(stringreader); 

var mainborder = XamlReader.Load(xmlreader);      
SBWindowContainerCanvas.Children.Add((Blacklight.Controls.ClippingBorder)mainborder); 

边框包含许多子元素,包括一些用户控件。

XAML文件的部分片段:

<av:ContentControl Name="VisScoreCC" Width="417" Height="228" IsHitTestVisible="True" av:Canvas.Left="855" av:Canvas.Top="8" av:Selector.IsSelected="False"> 
    <fsp:Scores3DigitControl Name="Vis3DigitScoreControl" VisitorControl="True" OperatorControl="True" NumericValue="4" UseGradientMainBG="False" UseGradientNumberBG="False" UseGradientLogoBG="False" UseGradientTeamNameBG="False" UseRadialMainBG="False" UseRadialNumberBG="False" UseRadialLogoBG="False" UseRadialTeamNameBG="False" UseImageStringMainBG="False|none|False|Tile|Top Left|1" SolidColorMainBG="#FFD4D2D2" SolidColorNumberBG="#FF000000" SolidColorBannerBG="#FF000000" FGColorNumbers="#FFFF0000" FGColorTeamName="#FFFFFFFF" FGColorBanner="#FFFFA500" SolidColorImageLogoBG="#FF000000" SolidColorTeamNameBG="#FF000000" GradientMainBG="#FF000000|#FF808080|#FFFFFFFF" GradientNumberBG="#FF000000|#FF808080|#FFFFFFFF" GradientLogoBG="#FF000000|#FF808080|#FFFFFFFF" GradientTeamNameBG="#FF000000|#FF808080|#FFFFFFFF" GradientOffsetsMainBG="0|0.5|1" GradientOffsetsNumbersBG="0|0.5|1" GradientOffsetsLogoBG="0|0.5|1" GradientOffsetsTeamNameBG="0|0.5|1" LinearAngleMainBG="180" LinearAngleNumberBG="180" LinearAngleLogoBG="180" LinearAngleTeamNameBG="180" OffSegmentOpacity="0.1" RoundRadiusNumbers="0" RoundRadiusLogo="0" RoundRadiusTeamName="0" PosSizeStringNumbers="180|8|200|150" PosSizeStringLogo="20|10|150|150" PosSizeStringTeamName="25|165|360|60" TeamNameFontString="Arial|40|True" UseRightSideBanner="True" Style="{av:DynamicResource Scores3DigitControlTemplate}" Height="Auto" Margin="0,0,0,0" IsHitTestVisible="True" /> 
</av:ContentControl> 
<av:ContentControl Name="HomeScoreCC" Width="417" Height="228" IsHitTestVisible="True" av:Canvas.Left="11" av:Canvas.Top="8" av:Selector.IsSelected="False"> 
    <fsp:Scores3DigitControl Name="Home3DigitScoreControl" VisitorControl="False" OperatorControl="True" NumericValue="4" UseGradientMainBG="False" UseGradientNumberBG="False" UseGradientLogoBG="False" UseGradientTeamNameBG="False" UseRadialMainBG="False" UseRadialNumberBG="False" UseRadialLogoBG="False" UseRadialTeamNameBG="False" UseImageStringMainBG="False|none|False|Tile|Top Left|1" TargetElementIndex="0" SolidColorMainBG="#FFD4D2D2" SolidColorNumberBG="#FF000000" SolidColorBannerBG="#FF000000" FGColorNumbers="#FFFF0000" FGColorTeamName="#FFFFFFFF" FGColorBanner="#FFFFA500" SolidColorImageLogoBG="#FF000000" SolidColorTeamNameBG="#FF000000" GradientMainBG="#FF000000|#FF808080|#FFFFFFFF" GradientNumberBG="#FF000000|#FF808080|#FFFFFFFF" GradientLogoBG="#FF000000|#FF808080|#FFFFFFFF" GradientTeamNameBG="#FF000000|#FF808080|#FFFFFFFF" GradientOffsetsMainBG="0|0.5|1" GradientOffsetsNumbersBG="0|0.5|1" GradientOffsetsLogoBG="0|0.5|1" GradientOffsetsTeamNameBG="0|0.5|1" LinearAngleMainBG="180" LinearAngleNumberBG="180" LinearAngleLogoBG="180" LinearAngleTeamNameBG="180" OffSegmentOpacity="0.1" RoundRadiusNumbers="0" RoundRadiusLogo="0" RoundRadiusTeamName="0" PosSizeStringNumbers="35|8|200|150" PosSizeStringLogo="250|10|150|150" PosSizeStringTeamName="25|165|360|60" TeamNameFontString="Arial|40|True" UseRightSideBanner="False" Style="{av:DynamicResource Scores3DigitControlTemplate}" OverridesDefaultStyle="False" Name="Home3DigitScoreControl" Height="Auto" IsHitTestVisible="True" /> 
</av:ContentControl> 

当我想访问我的控件代码隐藏,我不能用实际重新挂钩的元素:

Scores3DigitControl Vis3DigitScoreControlC = (Scores3DigitControl)SBWindowContainerCanvas.FindName("Vis3DigitScoreControl"); 
if (Vis3DigitScoreControlC == null) 
{ 
    MessageBox.Show("Couldn't Find Vis"); 
} 
else 
{ 
    Vis3DigitScoreControlC.Visibility = Visibility.Hidden; 
} 

UI元素在屏幕上显示正常,但我总是收到“无法找到Vis”消息。从我读到的所有内容来看,只要我的元素是画布中的某个小孩,使用FindName就可以工作,对吗?我错过了什么?

谢谢

+1

主要是缺少换行符。 – 2011-05-25 23:55:52

+0

我在HB上换行。 – evanb 2011-05-25 23:57:36

+0

@evanb:实际上,我只是试图添加一些,它不漂亮... – 2011-05-26 00:02:45

FindName通常用于从模板中获取元素。在你的情况你可能最好使用LogicalTreeHelper

LogicalTreeHelper.FindLogicalNode(SBWindowContainerCanvas, 
            "Vis3DigitScoreControl"); 
+0

太棒了!这就是答案!我添加了一点,以便将其范围扩展到我的UC:Scores3DigitControl x = LogicalTreeHelper.FindLogicalNode(SBWindowContainerCanvas,“Vis3DigitScoreControl”)作为Scores3DigitControl;它完美的工作。谢谢! – sunriser 2011-05-26 00:29:37

+0

这里仍在学习格式化。希望这看起来更好:Scores3DigitControl x = LogicalTreeHelper.FindLogicalNode(SBWindowContainerCanvas,“Vis3DigitScoreControl”)作为Scores3DigitControl;'' – sunriser 2011-05-26 00:36:15

尝试使用X:不是名称的名称和该元素加载后检查。

+0

不幸的是,这并没有奏效,但是谢谢你的尝试! – sunriser 2011-05-26 00:31:45

LogicalTreeHelper.FindLogicalNode(...)在这里工作,因为它会跨越NameScope boundries。

FindName(...)在相同的作品NameScope

动态添加控件需要对NameScopes有很好的理解。

尽量使用方法:

public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        yield return (T)child; 
       } 

       foreach (T childOfChild in FindVisualChildren<T>(child)) 
       { 
        yield return childOfChild; 
       } 
      } 
     } 
    } 

它应该返回给你,你需要的所有对象。之后你将可以在foreach循环中选择一个。