Xamarin表单 - 在按钮中加载图像

时间:2015-02-20 22:35:37

标签: c# button xamarin custom-renderer

我在网上看了很多,但我找不到任何真正具体的东西来帮助我解决这个问题。

我正在尝试为Xamarin表单中的Button组件创建自定义渲染器。为什么我不使用XLabs ImageButton组件?因为它与我当前的Android目标版本Android 4.0.3不兼容。

我也尝试过自己编写一些没有价值的代码,我很害羞发帖,除非你真的要求我:)

我需要这个代码,因为没有它,图像只是在尝试在任何按钮中使用它们时无法加载按钮:

<Button Image="someImage.png"/>

我尝试了以下教程:

http://blog.falafel.com/learning-xamarin-custom-renderers-in-xamarin-forms/

但我无法根据自己的需要进行调整。

3 个答案:

答案 0 :(得分:4)

根本没有显示图像吗?检查图像的位置。 ios中的默认位置是Resources文件夹,在android中它是resources / drawable,在wp中它是root。如果你想为每个解决方案想要一个图像而不是3个图像,请输入PCL并将build属性设置为嵌入式资源,并使用它所在的命名空间限定名称。即... ProjectName.Assets.image.png如果是在PCL资产目录中。不确定这是不是你的问题,但我想我会提供它,以防万一。

答案 1 :(得分:4)

您可以使用TapGestureRecognizer制作图像点击来解决此问题。要实现,请执行以下操作:http://www.c-sharpcorner.com/UploadFile/e04e9a/xamarin-forms-image-button-recipe/

答案 2 :(得分:1)

Charles Petzold关于Xamarin表格的优秀书籍第13章描述了这样做的正确方法:https://developer.xamarin.com/guides/xamarin-forms/creating-mobile-apps-xamarin-forms/

我解决这个问题的方法是(不同于本书)将转换器用于图像文件路径。 Button.Image属性是一个FileImageSource对象,它需要一个文件路径。遗憾的是,您无法在PCL中使用嵌入资源或内容文件。您必须在每个iOS,Android和UWP项目中添加单个图像文件。我这样做的方法是将图像添加到PCL并使用链接(添加现有文件对话框中的选项)。

所以这是我对上述问题的转换方法

<Button Image="{Binding Converter={StaticResource FileImageSourceConverter}, ConverterParameter=someImage.png}" />

静态资源......

<ContentPage.Resources>
    <ResourceDictionary>
        <local:FileImageSourceConverter x:Key="FileImageSourceConverter"/>
    </ResourceDictionary>
</ContentPage.Resources>

转换器......

public class FileImageSourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string filename = parameter as string;
        switch(Device.RuntimePlatform)
        {
            case Device.iOS:
            case Device.Android:
            default:
                return filename;
            case Device.Windows:
                return Path.Combine("Images", filename);
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

这种方法的优点是:(1)你的XAML不会被OnPlatform元素弄得乱七八糟; (2)您不需要将图像放在UWP项目的根目录中; (3)比使用自定义渲染更容易解决与某些人建议的相同的问题。