2010-01-06 67 views
2

在WPF應用程序我有對象,從自定義控制導出:C#投一個字符串對象

... 
<MyNamespace:MyCustControl x:Name="x4y3" /> 
<MyNamespace:MyCustControl x:Name="x4y4" /> 
... 

我可以參考這些目的,使用名稱:

x4y4.IsSelected = true; 

而且,這種功能效果很好:

public void StControls(MyCustControl sname) 
    { 
    ...   
     sname.IsSelected = true; 
    ... 
    } 

.... 

StControls(x4y3); 

但是我想在調用這個方法時使用一個字符串來引用一個對象。像這樣(但不工作):

 MyCustControl sc = new MyCustControl(); 
     string strSc = "x1y10"; 
     sc.Name = strSc; 

     StControls(sc); // nothing's happening 

而這樣一來,即使不能編譯:

 MyCustControl sc = new MyCustControl(); 
     string strSc = "x1y10"; 
     sc = (MyCustControl) strSc; // Cannot convert type string to MyCustControl 

     StControls(sc); 

如何使用string變量與對象來操作(即它轉換爲對象)?

回答

9

使用FindName: -

MyCustControl sc = (MyCustControl)this.FindName("x1y10"); 

當您使用X:在XAML名稱字段與該類背後CS的代碼相匹配的分部類中創建指定的名稱。這個部分類是找到InitialiseComponent實現的地方。在執行此方法期間,找到具有該名稱的對象並將其分配給該字段,FindName用於執行此操作。

如果您有一個字符串包含這樣一個名稱,您可以簡單地自己調用FindName,然後將返回的對象轉換爲自定義控件類型。

+0

此代碼提供了一個運行時錯誤:「未設置爲一個對象的實例對象引用」。並且:「使用NEW關鍵字創建對象實例」。我試圖使用NEW關鍵字 - 但它沒有幫助。它可能是什麼? – rem 2010-01-06 13:59:45

+1

@rem:你在XAML中有一個名爲「x1y10」的控件? – AnthonyWJones 2010-01-06 14:02:16

+1

@rem:該錯誤在示例行中沒有意義。除'this'之外,沒有對象引用,但不正確的使用會導致編譯時錯誤。很可能'sc'變量被設置爲'null',因爲找不到該控件,並且當您稍後嘗試在代碼中訪問該控件時發生異常。 – Thorarin 2010-01-06 14:04:13

4

這實際上並不是鑄造。你需要找到的名字控制,它可以這樣做的對象引用:

MyCustControl control = (MyCustControl)frameworkElement.FindName("x4y3"); 

哪裏frameworkElement是包含窗口(或類似網格中的任何面板)。從窗口後面的代碼,使用this應該工作:)

另請參見this question如果您計劃動態創建控件,而不是您的命名方案似乎建議給我。但是,如果是這種情況,FindName根本就不是必須的。創建它們時,只需將所有創建的控件的引用存儲在二維數組中。

int[,] controls = new int[10, 10]; 

for (int x = 0; x < 10; x++) 
{ 
    for (int y = 0; y < 10; y++) 
    { 
     // Create new control and initialize it by whatever means 
     MyCustControl control = new MyCustControl(); 

     // Add new control to the container  
     Children.Add(control); 

     // Store control reference in the array 
     controls[x, y] = control; 
    } 
} 

後來的後來,你可以訪問控制是這樣的:

controls[4, 3].IsSelected = true; 
+0

謝謝Thorarin!安東尼的回答早一點,所以我接受了他的回答。你的代碼示例對我有很大的幫助。再次感謝! +1 – rem 2010-01-06 14:16:09