我正在开发一个Silverlight应用程序,该应用程序具有为应用程序中的不同类型的Child Windows定义样式的资源文件。 <Style>
包含<ControlTemplate>
标记,其中包含各种内容。有没有办法在子窗口的类中设置<ControlTemplate>
中定义的控件的一个属性?
例如,想象一下在资源文件中我有如下标记:
<Style x:Key="MyChildWindowStyle" TargetType="sdk:ChildWindow">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="sdk:ChildWindow">
<Grid x:Name="Root">
...
<Image Source="/Assets/image.png" />
...
</Grid>
</ContentTemplate>
</Setter>
</Style>
现在假设我有许多配置为使用此样式的子窗口。我希望能够做的是从那些子窗口中的代码能够以编程方式更改图像的值Source
。
这可能吗?
由于
答案 0 :(得分:0)
在您的资源中,您可以执行以下操作:
<BitmapImage x:Key="MyImage" Source="/Assets/image.png"/>
<Style x:Key="MyChildWindowStyle" TargetType="sdk:ChildWindow">
...
<Image Source="{DynamicResource MyImage}" />
...
</Style>
然后在您的子窗口的代码隐藏中,您可以执行此操作:
Resources["MyImage"] = new BitmapImage(new Uri("/Assets/other-image.png"));
但是如果你的子窗口类在另一个程序集中,你应该写uri有点不同:
Resources["MyImage"] = new BitmapImage(new Uri("pack://application:,,,/MyOtherAssemblyShortName;component/Assets/other-image.png"));
您可以检查msdn page是否包格式。
但是我建议你使用MVVM模式,以便在绑定,样式等方面充分利用WPF。当你有一个视图模型而不是代码隐藏时,这些东西变得更简单了。您可能需要查看为MVVM设计的相关msdn page,codeproject sample,a toolkit或a validation mechanism。
答案 1 :(得分:0)
@ zahir的回答指出了我正确的方向,但为了让它在Silverlight中工作,我必须做以下事情:
首先,我将<BitmapImage>
标记添加到我的资源文件中,使用UriSource
属性指定默认值。
<BitmapImage x:Key="MyImage" UriSource="../Assets/DefaultImage.png" />
接下来,我在<ControlTemplate>
中引用了它,如此:
<Image ... Source="{StaticResource MyImage}"/>
然后,在我的代码隐藏类中,我能够像这样修改UriSource
属性:
BitmapImage img = (Application.Current.Resources["MyImage"] as BitmapImage);
if (img != null)
img.UriSource = "../Assets/NewImage.png";
当然,UriSource
的精确值取决于您处理图像资产的方式,位置等等。