【问题标题】:Why do I have an Issue with binding to an image from a control template?为什么我在从控件模板绑定到图像时遇到问题?
【发布时间】:2010-09-22 20:45:44
【问题描述】:

我有一个项目控件的样式,它绑定到目标中的图像,它仅在目标绑定到图像时出现,我不知道为什么.. 任何人都可以摆脱任何给我点灯?

我的风格的简化版:

<Style x:Key="testStyle" TargetType="ItemsControl">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto" LastChildFill="True">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="32"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Grid Grid.Row="0" DockPanel.Dock="Top" MinHeight="25" SnapsToDevicePixels="True">
                                <StackPanel Orientation="Horizontal">
                                    <Image Margin="10,0,10,0" VerticalAlignment="Stretch" Height="24" Width="24"  Source="{Binding Path=HeaderImage}" />
                                    <TextBlock FontFamily="Tahoma" VerticalAlignment="Center" Text="{Binding Path=HeaderInfo}" />
                                </StackPanel>
                                <Line VerticalAlignment="Bottom" Stretch="Fill"/>
                            </Grid>
                            <ItemsPresenter Grid.Row="1"/>
                        </Grid>
                    </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我的用户控制:

<UserControl x:Class="StartPageView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<ItemsControl Style="{DynamicResource testStyle}">
    <Grid HorizontalAlignment="Stretch" >
        <StackPanel>
        <GroupBox Header="Information"  Margin="0,0,0,10" >
            <Label Margin="10,10,10,110">some useful information, dynamically updated</Label>
        </GroupBox>
        <GroupBox Header="Available actions" Margin="0,10,0,10">
            <StackPanel>
                <Label Margin="10,10,10,10">action 1</Label>
                <Label Margin="10,10,10,10">action 2</Label>
                <Label Margin="10,10,10,10">action 3</Label>
                    <!--<Image Width="0" Height="0" Source="{Binding HeaderImage}"/>-->
                </StackPanel>
        </GroupBox>
        </StackPanel>
    </Grid>
</ItemsControl>

还有我的模型代码(设置为我的用户控件的数据上下文)

internal class StartPageViewPresentationModel : IStartPageViewPresentationModel
{
    public StartPageViewPresentationModel(IStartPageView view)
    {
        HeaderImage = new BitmapImage(new Uri(@"Images/home_16.png", UriKind.Relative)) { CacheOption = BitmapCacheOption.Default };

        HeaderInfo = "Start Page";

        View = view;
        View.Model = this;
    }

    public BitmapImage HeaderImage { get; set; }

    public string HeaderInfo { get; set; }

    public IStartPageView View { get; set; }
}

如果我取消注释用户控件中的标记,则图像会同时显示在控件和模板区域中,如果我注释它不会出现在任何一个中。模板中的文本绑定工作正常

我很困惑..

谢谢

特雷弗

【问题讨论】:

    标签: wpf image binding styles


    【解决方案1】:

    几个建议:

    1. 您是否尝试过图像的绝对 URI?
    2. HeaderImage 可以是 ImageSource 类型,而不是更严格的 BitmapImage

    我怀疑发生的事情是UserControl 正在工作,因为路径是相对且正确的,基于UserControl 的位置。因此,图像被缓存并根据模板工作。

    但是,当您注释掉图像是从Style 的位置解析时,这可能不正确?

    【讨论】:

    • 太棒了!谢谢!你是对的,去一个绝对URI修复它 HeaderImage = new BitmapImage(new Uri("pack://application:,,,/Myassembly.UI;component/Images/home_16.png"));一旦你指出它是有道理的,因为样式是在一个单独的程序集中.. Trev
    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2022-12-05
    • 2012-09-02
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多