我希望有一个名为RgbColorExtension
的标记扩展,其中R
属性是可绑定的,以便我使用滑块调整其值。
以下尝试不起作用。更改滑块不会影响R
属性。
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Sandbox.MainPage"
xmlns:local="clr-namespace:Sandbox"
>
<VerticalStackLayout>
<Slider x:Name="slider" Maximum="1"/>
<Label Text="{Binding Value,Source={x:Reference slider}}"/>
<BoxView HeightRequest="200" WidthRequest="200">
<BoxView.Color>
<local:RgbColor R="{Binding Value,Source={x:Reference slider}}" G="0" B="0" A="0.5"/>
</BoxView.Color>
</BoxView>
<BoxView
HeightRequest="200"
WidthRequest="200"
Color="{local:RgbColor R={Binding Value,Source={x:Reference slider}},G=0.5,B=0.5,A=.5}"
/>
</VerticalStackLayout>
</ContentPage>
namespace Sandbox;
public class RgbColorExtension : BindableObject, IMarkupExtension<Color>
{
public static readonly BindableProperty RProperty =
BindableProperty.Create(nameof(R), typeof(float), typeof(RgbColorExtension), 0.5f);
public float R
{
get => (float)GetValue(RProperty);
set => SetValue(RProperty, value);
}
public float G { get; set; }
public float B { get; set; }
public float A { get; set; }
public Color ProvideValue(IServiceProvider serviceProvider)
{
return Color.FromRgba(R, G, B, A);
}
object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
{
return (this as IMarkupExtension<Color>).ProvideValue(serviceProvider);
}
}
我错过了什么?
1条答案
按热度按时间pzfprimi1#
因为有4个参数,所以可以让
IMarkupExtension
实现(1)BindableObject
(已经实现了),(2)MultiBinding
,以及(3)IMultiValueConverter
。4个float
值可以参与MultiBinding
,IMultiValueConverter
将这4个float
值转换为Color
值。下面是一个工作实现: