Я пытаюсь написать пользовательский элемент управления Silverlight, который представляет резервуар для воды. У него есть два свойства зависимостей, liquidLevel и liquidCapacity, и я хочу передать оба этих параметра в конвертер вместе с GradientBrush. Идея заключается в том, что преобразователь будет выполнять расчет на основе уровня жидкости и емкости и регулировать градиентные упоры на щетке, чтобы создать видимость подъема и опускания жидкости.
у моего танка есть "окно", которое представляет собой просто прямоугольник и градиентный куст, пока у меня есть это
Мой шаблон управления
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MoreControls;assembly=MoreControls"
xmlns:assets="clr-namespace:MoreControls.Assets">
<LinearGradientBrush x:Name="LiquidLevelTankWindow" StartPoint="0.469,0.997" EndPoint="0.487,0.013">
<GradientStop Color="#FF1010F1" Offset="0.0"/>
<GradientStop Color="#FF5555FB" Offset="0.55"/>
<GradientStop Color="#FFE4E4F1" Offset="0.6"/>
<GradientStop Color="#FFFAFAFD" Offset="1"/>
</LinearGradientBrush>
<assets:LiquidLevelBrushConverter x:Name="LiquidLevelBrushConverter" levelBrush="{StaticResource LiquidLevelTankWindow}"/>
<Style x:Key="Liquid" TargetType="local:LiquidTank">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:LiquidTank">
// * parts of the control here *
// the part of the control im interested in
<Rectangle x:Name="TankWindow" Width="32.3827" Height="64" Canvas.Left="27" Canvas.Top="42" Stretch="Fill" StrokeLineJoin="Round" Stroke="#FF000310"
Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=LiquidLevel, Converter={StaticResource LiquidLevelBrushConverter}}" />
// * rest of control template *
Использование элемента управления в xaml (в конце концов я хочу связать эти свойства)
<local:LiquidTank Style="{StaticResource Liquid}" LiquidCapacity="100" LiquidLevel="50"/>
и преобразователь
public class LiquidLevelBrushConverter : IValueConverter
{
public LinearGradientBrush levelBrush { get; set; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//I can access the liquid level parameter here
double level = 0;
double.TryParse(value.ToString(), out level);
GradientStopCollection gsc = levelBrush.GradientStops;
//some logic to alter gradient stops
return null;
}
Теперь я хочу получить доступ ко второму управляющему свойству liquidCapacity из моего конвертера, чтобы я мог рассчитать процент заполнения бака. Я попытался передать liquidCapacity в качестве параметра конвертера, но если это возможно, я не могу понять синтаксис (я довольно новичок в Silverlight).
Теперь, когда я зашел так далеко, я думаю, что мог бы создать одно свойство зависимости, называемое fillpercentage, и выполнить этот расчет в возможной модели представления, но с учетом того, как будут организованы данные, я почти уверен, что у меня будет совершенно новый множество проблем, если я попробую это. Мне кажется более управляемым, чтобы иметь возможность жестко кодировать емкость жидкости в xaml и связывать уровень жидкости с моделью представления. Модель представления будет вытягивать кучу значений из базы данных в наблюдаемый словарь, одним из которых является уровень ликвидности, поэтому я думаю, что было бы намного проще связать уровень жидкости непосредственно с наблюдаемым словарем, чем пытаться преобразовать его до «fillpercentage» в модели представления перед его привязкой.
Плюс, я довольно упрямый, и в интересах моего образования кто-нибудь знает, возможно ли то, что я предложил сделать. Если да, то как правильно это сделать?