2011-05-25 48 views
2

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

回答

4

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

0

嘗試使用X:不是名稱的名稱和該元素加載後檢查。

+0

不幸的是,這並沒有奏效,但是謝謝你的嘗試! – sunriser 2011-05-26 00:31:45

0

LogicalTreeHelper.FindLogicalNode(...)在這裏工作,因爲它會跨越NameScope boundries。

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

動態添加控件需要對NameScopes有很好的理解。

1

儘量使用方法:

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循環中選擇一個。