0

我在访问我实现的“Silverlight 模板化控件”的 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。如果我用 Image 替换 TextBlock,那么内容就会消失。这些图像与包含已发布 XAML 的“Generic.xaml”位于同一文件夹中。我在同一个文件夹中有其他 png 文件,并且我在其他 XAML 文件中也可以在 ControlTemplate (在 UserControl 中)之外的同一个文件夹中访问它们,并且它们可以工作。

以下是我迄今为止为解决这个问题而尝试的方法,但也没有奏效:

1)将图片复制到与ControlDragger.cs所在的实现相同的文件夹中

2)通过“OnApplyTemplate”中的名称访问按钮并尝试通过代码设置图像

3) 加载另一个 png 文件以确保使用的 png 文件没有损坏。

我还尝试使用 Source="http://..." 从互联网访问随机图像,这很有效。出于调试原因,我还在图片上实现了 ImageFailed 事件,并将其附加在“OnApplyTemplate”中。事实上,它加载失败,但事件参数并没有告诉我为什么它没有加载。如果我错过了什么,有人知道吗?

4

2 回答 2

2

试试这个(即使你的图像和样式在同一个程序集中):

"/Assembly;Component/{相对路径}/Icon_small_add.png"

程序集 - 是程序集名称,其中 Icon_small_add.png 图像包含 {Relative Path} - 图像的文件夹路径

例如“/ControlsLib;Component/Resources/Images/Icon_small_add.png”

于 2010-11-01T21:00:34.097 回答
0

谢谢,这解决了它。它也解释了我为什么会遇到这些问题。

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

所以在 Image.Source 属性中指定程序集解决了这个问题。

于 2010-11-02T02:26:46.660 回答