0

我正在开发一个 Silverlight 应用程序,该应用程序具有为应用程序中不同类型的子窗口定义样式的资源文件。<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.

这可能吗?

谢谢

4

2 回答 2

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 页面以获取包 uri 格式。

但我建议您使用 MVVM 模式,以便在绑定、样式等方面充分利用 WPF。当您拥有视图模型而不是代码隐藏时,这些事情会变得更简单。您可能想查看相关的msdn 页面代码项目示例工具包或为 MVVM 设计的验证机制。

于 2012-10-09T16:41:25.247 回答
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取决于您处理图像资产的方式、它们的位置等。

于 2012-10-09T23:40:41.323 回答