使用 Xamarin.Forms 中另一个项目的资源

Using Resource from another Project in Xamarin.Forms

我一直在 Xamarin.Forms 中开发自定义 UI 元素,它具有 2 个图像绑定属性。 UI 元素本身没有任何图像,所以我必须在外部提供它。

我尝试了很多方法,但都不起作用。最后,我通过使用 android 项目(在 Resources\drawable 文件夹中)中的图像来实现,但是当我更改图像时,出现错误。

Throwing OutOfMemoryError "Failed to allocate a 20266212 byte allocation
with 12787592 free bytes and 12MB until OOM" load image from file

和我的代码:

     <StackLayout Grid.Row="1">
            <customelements:CustomImageButton
                x:Name="btnReadout"
                ButtonText="Read"               
                ImageButton_Tapped="CustomImageButton_ImageButton_Tapped"                                       
                DisabledImageSource="read_disabled.png"
                EnabledImageSource="read_enabled.png"                                         
                IsButtonActive="True"
                />
        </StackLayout>

在我的可绑定 属性 事件中,我调用

button.BackgroundImage = ImageSource.FromFile(enabledImageSource);

button.BackgroundImage = ImageSource.FromFile(disabledImageSource);

如果我多次更改 IsButtonActive 的 属性,则会出现上述异常。据我了解,不知何故它没有从内存中清除,它使用的是路径而不是直接资源。

PS: 资源已设置为android资源,我使用的是真实设备,图像大小为27 kb

您的 OutOfMemoryError 与绑定无关。它与图像的大小(像素and/or 字节)有关。已找到有关 OOM 的更多信息 here

您可能会发现使用 垃圾收集 很有用。找到有关它的更多信息 here

听起来您的代码将相同的两张图像一遍又一遍地加载到内存中而不处理它们(因此使用垃圾收集可能会有用)。或者,您最好创建包含要显示的图像的静态对象。例如:

private static FileImageSource enabledImageSource = ImageSource.FromFile("enabledImage");
private static FileImageSource disabledImageSource = ImageSource.FromFile("disabledImage"); 

/* --- Further down the code --- */

private void EnableView(bool enable)
{
    button.BackgroundImage = 
        enable ?
        enabledImageSource :
        disabledImageSource;
}

我在这里所做的只是创建了 enable/disable 图像的两个实例。然后我调用这些实例以防止一遍又一遍地创建相同图像的新实例。