WPF - 绑定菜单图标

4
我是一名有用的助手,可以为您翻译文本。
我有一个包含菜单的用户控件。我需要将菜单图标绑定到用户控件的属性,但它无法工作。
代码从以下部分开始 -
        <Border Grid.Row="0">            
        <DockPanel>
            <Image x:Name="testImage" Height="16" Width="16" Source="{Binding ElementName=UC,Path=AddImage}"/>
            <Menu DockPanel.Dock="Left" Height="20"
              VerticalAlignment="Center">
                <MenuItem Header="{Binding ElementName=UC,Path=AddText}">
                    <MenuItem.Icon>
                        <!--<Image x:Name="workswhenin" Height="16" Width="16" Source="pack://application:,,/Kowdox;component/Images/UserIcons/user_add.png"/>-->

                        <Image x:Name="realImage" Height="16" Width="16"
                        Source="{Binding ElementName=UC,Path=AddImage}"/>
                    </MenuItem.Icon>
                </MenuItem>

您看到的第一张图片(testImage)工作得很完美,所以我很高兴绑定是正确的。第二张图片(被注释掉并命名为'workswhenin')包含了我传递给用户控件绑定属性的打包URI,它也起作用,但第三张图片(realImage)根本没有出现!我看不出为什么它不起作用;我知道绑定是好的,我知道图片在标记中的位置也很好,那么怎么回事呢?
非常感谢您的帮助。 提前致谢。
1个回答

5

无法确定问题原因,因为我无法看到您的代码,但我相信我知道问题出在哪里。

Image.Source 期望一个 ImageSource 类型的对象。当您在 XAML 中指定 URL 时,会使用默认的 WPF 转换器将 URL 转换为 ImageSource 对象。因为您正在使用绑定,所以不会使用默认转换器。所以您可能正在尝试将图像源设置为 URL 值而不是 ImageSource 对象。

在您的代码后台属性中,您将需要创建一个 ImageSource 对象,这真的很麻烦。您可以创建一个 BitmapImage 并传入 URL。

最简单的解决方案是在您要绑定的代码后台属性中使用 Microsoft 的默认转换器,或者在绑定中显式使用它。转换器称为 ImageSourceConverter

编辑:

这里是一个简单的示例:

绑定源内部的代码:

public ImageSource AddImageSource
{
    get
    {
        ImageSourceConverter imgConv = new ImageSourceConverter();
        return imgConv.ConvertFrom(this.AddImage);
    }
}

将绑定更新为以该属性为目标,而不是AddImage属性。当AddImage属性更改时,确保也触发PropertyChanged事件。

没有花时间构建测试场景,但应该可以在没有任何问题的情况下工作。


这个问题已经被浏览了1000次,而你(有帮助且正确的)答案只得到了一个赞同,...来自我!如果人们发现答案有用,他们真的应该更多地使用他们的投票。 - EightyOne Unite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接