2010-10-06 57 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。