2010-10-31 56 views
0

我在实现的“Silverlight模板控件”的ControlTemplate中访问图像时遇到问题。我的控制称为“ControlDragger”的作风是:加载Silverlight ControlTemplate中的图像时出现问题

<!-- 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”中。事实上,它加载失败,但事件参数不告诉我为什么它没有加载。如果我错过了什么,有没有人有想法?

回答

2

试试这个(即使你的形象和风格在同一组件):

“/组装;组件/ {相对路径} /Icon_small_add.png”

大会 - 是集名称中Icon_small_add .png图像包含 {相对路径} - 文件夹路径到您的图像

eg “/ControlsLib;Component/Resources/Images/Icon_small_add.png”

0

谢谢,修复它。这也解释了为什么我有这些问题。

我在与应用程序不同的程序集中实现了我的控件。所以应用程序加载了一个包含我的控件的页面并呈现它们。但图像在Silverlight中异步加载,到此阶段,我的应用程序程序集再也找不到图像了。

因此,在Image.Source属性中指定程序集即可解决该问题。