我在实现的“Silverlight Templated Control”的ControlTemplate中访问图像时遇到问题。我称之为“ControlDragger”的控件样式如下:
<!-- ControlDragger Menu button style -->
<Style x:Key="MenuButtonStyle" TargetType="Button">
<Setter Property="Margin" Value="5,0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<ContentPresenter HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- ControlDragger -->
<Style TargetType="core:ControlDragger">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="core:ControlDragger">
<Border x:Name="ControlDraggerRoot"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
VerticalAlignment="{TemplateBinding VerticalAlignment}"
MinHeight="{TemplateBinding MinHeight}"
MinWidth="{TemplateBinding MinWidth}"
MaxHeight="{TemplateBinding MaxHeight}"
MaxWidth="{TemplateBinding MaxWidth}"
Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}">
<Grid Background="Transparent">
<Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="#DBDBDB" BorderThickness="1" >
<Border.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#F7F7F7" Offset="0" />
<GradientStop Color="#FDFDFD" Offset="1" />
</LinearGradientBrush>
</Border.Background>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="36" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- Title bar plus drag start -->
<Border x:Name="DragStartElement" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderThickness="0"
Background="Transparent">
<TextBlock x:Name="Headline" FontSize="14" Margin="14,5,0,0" />
</Border>
<!-- Clickable icons -->
<Border Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Top" Height="26" CornerRadius="13" Margin="0,5,5,0"
BorderThickness="1" BorderBrush="#9EA9B3">
<Border.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#EDECEE" Offset="0" />
<GradientStop Color="#FBFBFC" Offset="1" />
</LinearGradientBrush>
</Border.Background>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="5,0">
<Button x:Name="AddIcon" Style="{StaticResource MenuButtonStyle}">
<Image Source="Icon_small_add.png" Stretch="None" />
<!--
<TextBlock Text="A" />
-->
</Button>
<Button x:Name="DeleteIcon" Style="{StaticResource MenuButtonStyle}">
<TextBlock Text="D" />
<!--
<Image Source="Icon_small_delete.png" Stretch="None" />
-->
</Button>
</StackPanel>
</Border>
<!-- Content holder -->
<Border Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="14,0,14,9">
<ContentPresenter/>
</Border>
</Grid>
</Border>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
此模板包含一个添加和删除按钮,这些按钮也会重新设置样式。一旦我将TextBlock作为任一按钮的内容,将显示内容 - TextBlock。如果我用图像替换TextBlock,那么内容就会消失。这些图像与包含已发布的XAML的“Generic.xaml”位于同一文件夹中。我在同一文件夹中有其他png文件,我在其他XAML文件中访问它们也在ControlTemplate(在UserControl中)之外的同一文件夹中,它们可以工作。
到目前为止,我尝试过以解决这个问题的方法,这些方法也没有用:
1)将图片复制到与ControlDragger.cs
的实现相同的文件夹中2)通过“OnApplyTemplate”中的名称访问按钮并尝试通过代码设置图像
3)加载另一个png文件以确保使用的png文件没有损坏。
我还尝试使用Source =“http:// ...”从互联网访问随机图像,这很有用。出于调试原因,我还在图片上实现了ImageFailed事件,并将其附加在“OnApplyTemplate”中。事实上,它加载失败,但事件参数并没有告诉我它为什么没有加载。如果我错过了什么,有没有人有想法?
答案 0 :(得分:2)
试试这个(即使你的图像和样式在同一个程序集中):
“/ Assembly; Component / {Relative Path} /Icon_small_add.png”
Assembly - 是Icon_small_add.png图像包含的程序集名称 {相对路径} - 图像的文件夹路径
e.g。 “/ControlsLib;Component/Resources/Images/Icon_small_add.png”
答案 1 :(得分:0)
谢谢,修好了。它也解释了为什么我遇到这些问题。
我在与应用程序不同的程序集中实现了我的控件。因此,应用程序加载了一个包含我的控件并进行渲染的页面但是图像是在Silverlight中异步加载的,在这个阶段我的应用程序程序集无法再找到图像。
因此,在Image.Source属性中指定程序集可以解决问题。