Xamarin.Forms使用资源x:密钥不可用

时间:2017-04-29 17:50:13

标签: c# xaml xamarin.forms

我有一个Xamarin.Forms应用程序(顺便说一下,我是Xamarin的新手)。我在页面上有很多元素。我想根据视图模型中的属性值设置按钮的颜色。我有一个自定义的IValueConverter类,可以根据整数值将整数值转换为不同的颜色对象。

我不太清楚如何让这个工作。我正在使用Brian Lagunas的prism nuget包和模板。这是我的示例代码作为图像。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
         prism:ViewModelLocator.AutowireViewModel="True"
         x:Class="PlayAlongJ.Views.MainPage"
             xmlns:converters="clr-namespace:PlayAlongJ.Converters;assembly=PlayAlongJ"
         Title="Play-along with J">
<ContentPage.Resources>
    <ResourceDictionary>
        <converters:IntToColorConverter x:Name="intToColor"/>
    </ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
    <StackLayout Margin="15,30">
        <StackLayout HorizontalOptions="End" Orientation="Horizontal">
            <Label Text="Chest Total" VerticalTextAlignment="Center"/>
            <Button x:Name="ChestTotal" Text="{Binding ChestAmount}" 
                      BackgroundColor="Blue"
                      TextColor="White" WidthRequest="150"></Button>
        </StackLayout>
    </StackLayout>
</ContentPage.Content>

我面临的第一个问题是,在我的页面资源字典部分,我无法获得我尝试使用的任何资源的x:Key属性。我只得到一个x:Name属性。例如,如果我想用语法设置Style资源,我只得到x:Name,而不是x:Key。我也在尝试使用我的值转换器。当我使用它时,我再次得到x:Name,而不是x:Key。如果我选择在字典资源中使用x:Name,我会收到一个编译错误,说资源需要一个x:Key,显然我无法使用它,因为它不可用。

这是我的IValueConverter实现。有人可以告诉我如何正确设置资源和我的转换器?我更喜欢在XAML中而不是在代码中设置它们。此外,一旦我可以在没有编译错误的情况下设置资源,可以使用示例代码行将我的按钮的BackgroundColor设置为viewmodel中的绑定整数属性。如果整数是负数,我想使用红色,否则,使用值转换器使用其他颜色。

public class IntToColorConverter : IValueConverter
{
    public Object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return System.Convert.ToInt32(value) >= 0 ? Color.Blue : Color.Red;
    }

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

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:2)

您应该使用x:Key属性,就像错误消息告诉您的那样。这是XAML文件中的IntelliSense无法显示所有可能选项的情况之一。如果它没有显示,并不意味着当您使用XAML时它不可用。

请查看the Xamarin documentation on Resource Dictionaries以获取有关如何在资源上使用x:Key属性的完整说明。关于你的问题,该文章中最重要的部分是:

  

每个资源都有一个使用x:Key属性指定的键,它在ResourceDictionary中为它提供了一个描述性键。

然后,您可以通过StaticResource标记扩展程序使用您的转换器(查看BackgroundColor属性的内容):

 <Button x:Name="ChestTotal" Text="{Binding ChestAmount}" 
     BackgroundColor="{Binding ChestAmount, Converter={StaticResource intToColor}}"
     TextColor="White" WidthRequest="150"></Button>

答案 1 :(得分:1)

无论它告诉你什么,你应该使用x:Key,如下所示:

<ResourceDictionary>
    <converters:IntToColorConverter x:Key="intToColor"/>
</ResourceDictionary>

IntelliSense有时可能会失败。为确保您的XAML有序,您可以查看XAML Compilation

然后它应该以{{1​​}}的形式提供,您可以在按钮中使用它,如下所示:

StaticResource

另请按照this link与Xamarin文档进行更广泛的解释。