2010-10-06 103 views
1

我在XAML定義如下的資源(myPoint):在C#中修改資源?

<Path Name="myPath"> 
    <Path.Resources> 
     <Point x:Key="myPoint" X="200" Y="200"/> 
    </Path.Resources> 
</Path> 

在OnApplyTemplate覆蓋在相應的C#代碼,我使用以下方法來獲得該資源的引用。

myPointReference = (Point)myPath.FindResource("myPoint"); 

現在,每當我修改myPointReference的價值,讓我們說,

myPointReference.X = 30; 

它不修改資源myPoint的價值,它只是改變myPointReference的價值。我如何使myPointReference實際引用我的XAML定義的資源myPoint,以便在修改myPointReference的值時,我也在修改myPoint的值?

+2

Point是一個值類型。每次訪問都是副本,因此你不能這樣做。你試圖達到的最大效果是什麼?可能有另一種方式來做到這一點。 – Tergiver 2010-10-06 23:08:31

+1

最重要的是,您將無法通過當前的方式更改XAML本身。如果這就是你所說的?如果你殺了應用程序並將其恢復啓動,那麼這些值將不會改變......除非我對你正試圖完成的任務感到困惑...... – 2010-10-06 23:11:15

+0

我見過C#中值類型的例子通過引用傳遞,使用ref關鍵字,但我不能在這種情況下工作,因爲我沒有使用函數。更大的圖像是這樣的:我有一個正在使用點作爲動態資源繪製的形狀。希望在C#中我可以改變這些資源的值來改變形狀。我可以使用依賴屬性,但我不想將屬性公開給我的類的用戶。我希望他們使用我的功能來操縱形狀。 – Dalal 2010-10-06 23:18:38

回答

1

當您在XAML中使用Resources擴展時,您正在處理ResourceDictionary,並且正在處理向此字典中添加一個結構(aka值類型)的值,該值將通過值(又名複製)傳遞給此字典,然後當你提出要求時你會得到一份副本。

處理ResourceDictionary時無法通過引用傳遞值類型。

但是,如果在修改副本後確實需要執行此操作,則可以使用修改的副本替換字典中的舊副本。

您可以通過調用試試這個:

myPath.SetResourceReference("myPoint", myPointReference) 

你可能要考慮在XAML不這樣做或使用資源字典。您可以僅在後面的代碼中管理Point並根據需要更新它並將其設置爲Path。