2012-06-26 28 views
0

我有WPF的問題 - 我在這個智能技術中很安靜。所以問題是:如何獲取WPF資源中元素的引用?

我有一個窗口。在這個窗口的資源中,我存儲了一個元素 - 例如。具有唯一鍵的網格(假設x:Key =「myGrid」)。在這個網格中,我有一個由名稱標識的文本框(x:Name =「myTextBox」)。 我的窗口只包含一個空格子(命名爲例如winGrid)。我以編程方式將myGrid設置爲winGrid的子項。現在,在運行時,我想獲得對myTextBox對象的引用。我花了大量的時間搜索,但沒有爲我工作(FindName和類似的方法)。

你有任何想法,我必須做些什麼來讓球滾動?

這裏是(僞)代碼片斷一次:

<Window x:Class="LoginForm.RidicWindow" 
    ...> 
<Window.Resources> 
    <Grid x:Key="myGrid"> 
     <Border... 
     <Grid... 
      ... 
      <TextBlock x:Name="myTextBlock" Grid.Column="0".../> 
     </Grid> 
    </Grid> 
</Window.Resources> 
<Grid x:Name="winGrid"> 
    ... 
</Grid> 

現在我設定的myGrid爲winGrid的孩子: (像)

winGrid.Childrens.Clear(); 
winGrid.Childrens.Add((Grid)FindResource(myGrid)); 

現在我想獲取myTextBlock的引用,它是myGrid的後代。

我想是這樣

((Grid)FindResource(myGrid)).FindByName("myTextBlock"); 

這一點,當然,不能正常工作。

希望你能理解我,我想得到的。 很多謝謝!

+0

WPF/XAML如何處理名稱範圍[鏈接](http://msdn.microsoft.com/en-us/library/ms746659.aspx)這可能是與,它說資源字典d ont使用它們,因此它可能不會在創建控件時在後臺連接名稱。我相信做你想要實現的目標方法是創建一個包含'myGrid'的UserControl,然後將該UserControl的一個新實例添加到'winGrid'中。你可以得到一個對UserControl和FindName的引用(例如'var uc =(FrameworkElement)winGrid.Children [0]; uc.FindName(「...」);' –

回答

2

你不能這樣做(順便說一句,你可以,但它確實很糟糕,醜陋而且不推薦)爲另一個目的服務的窗口資源。

如上所述,您必須創建一個組件(用戶控件或其他)。雖然還有其他一些選項可供您尋找。 你可以嘗試一些什麼,我下面寫道:


1)創建自定義組件可以是用戶控件,電網或其他任何東西...

<Grid x:Class="Project.MyGridControl" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       mc:Ignorable="d" 
       d:DesignHeight="300" d:DesignWidth="300"> 
<!-- Content --> 
    </Grid> 

 MyGridControl control = new MyGridControl(); 
     winGrid.Childrens.Add(control); 


2)有點複雜:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <!-- Content --> 
</Grid> 

Grid myCustomGrid = XamlReader.Load(uriResource) as Grid; 
winGrid.Childrens.Add(myCustomGrid); 

在這個選項中,你不會有像網格控件一樣實例化。 (我發現它經常用在報告中)。您應該創建一個.xaml並將其定義爲資源。


要查找的組件,你應該看看在視覺樹(前面已經回答)...

How can I find WPF controls by name or type?

+0

Thanx!是的,我知道那裏是更好的方式來獲得相同的(視覺)解決方案。現在我做的有點不同,但是...自從我遇到這個問題,我想有一個解決方案或知道,爲什麼它是不可能的,一名教授說:一個人不會說「我有問題」,但「我有一個挑戰」:) –

0

來自小羊的評論提供了一個好的開始,儘管我建議創建一個UserControl,然後通過控件上的屬性公開TextBox來簡化事情。但是,如果您的設計需要使用上面概述的方法,則需要使用VisualTreeHelper,特別是GetChild()方法來導航VisualTree,以在網格中查找TextBox。我已經使用下面的方法來查找可視化樹中的項目,並且它可能會爲你做訣竅。

/// <summary> 
    /// Will navigate down the VisualTree to find an element that is of the provided type. 
    /// </summary> 
    /// <typeparam name="T">The type of object to search for</typeparam> 
    /// <param name="element">The element to start searching at</param> 
    /// <returns>The found child or null if not found</returns> 
    public static T GetVisualChild<T>(DependencyObject element) where T : DependencyObject 
    { 
     T child = default(T); 
     int childrenCount = VisualTreeHelper.GetChildrenCount(element); 

     for (int i = 0; i < childrenCount; i++) 
     { 
      DependencyObject obj = VisualTreeHelper.GetChild(element, i); 
      if (obj is T) 
      { 
       child = (T)obj; 
       break; 
      } 
      else 
      { 
       child = GetVisualChild<T>(obj); 
       if (child != null) 
        break; 
      } 
     } 

     return child; 
    } 

直接讓GetVisualChild(myGrid),它應該回到它涉及到在myGrid第一個TextBox。

希望這會有所幫助。

-1

如果你只想在整個應用程序的任何層次尋找資源那就試試這個...

var myResource = Application.Current.FindResource("MyResource"); 
+0

這是不正確的 –

相關問題