У меня есть WPF 'виджет монитора', который отображает ЦП, RAM и производительность диска как панели небольшого процента. Я использую следующий градиент в качестве ресурса для деления панелей на 4 раздела (т.е. 0% - 25%, 25% - 50%, и т.д.)
Первоначально, 0%-е положение панелей было наверху (панель. Высота = 0) и 100% была внизу (панель. Высота = 15). Размер панели изменился бы путем простой корректировки его свойства Height. Все хорошо работало, но я предпочту, чтобы 0%-е положение панелей было внизу вместо этого, т.е. панели 'станут' восходящими.
То, чтобы заставлять панели стать восходящим не было никакой проблемой, но проблема, которую я действительно имею, состоит в том, что градиент теперь перемещается с прямоугольником, так, чтобы вершина прямоугольника была всегда зеленой, неважно, насколько маленький это. Я понимаю, что это вызвано тем, что я теперь использую Холст. SetTop, чтобы переместить вершину прямоугольников (панели), а также изменить их высоту. Как я могу вызвать градиент к абсолютной позиции, независимо от положения прямоугольника?
(фоновая непрозрачность)
Извините, я знаю, что изображение является маленьким, но необходимо просто смочь разобрать, что средняя панель начинает с главного (зеленого) и становится нисходящей, заканчивающийся в оранжевом (50%-е-75% значение). Левая панель запускается внизу (это - то, что я хочу), но градиент в этой панели перемещается с высотой... это - проблема. Обратите внимание, что я инвертирую градиент, когда я смогу решить эту проблему, так, чтобы красный представил лучшие 25%. В этом примере нижняя четверть должна быть красной, следующий оранжевый квартал и желтый остаток.
Я не могу полагать, что нет никакого простого решения для этого... прибывают в черепные коробки.:) Как насчет того, чтобы переместить абсолютное положение градиента с прямоугольником... это возможное???
(Связывающий сообщение: Определение максимальной скорости передачи данных жесткого диска компьютера программно с C#)
Обрезать прямоугольник со значениями, заданными во время выполнения.
<Window.Resources>
<LinearGradientBrush x:Key="Quarters" StartPoint="0,0" EndPoint="0,1" >
<GradientStop Color="LightGreen" Offset="0.0" />
<GradientStop Color="LightGreen" Offset="0.24" />
<GradientStop Color="Yellow" Offset="0.25" />
<GradientStop Color="Yellow" Offset="0.49" />
<GradientStop Color="Orange" Offset="0.5" />
<GradientStop Color="Orange" Offset="0.74" />
<GradientStop Color="Red" Offset="0.75" />
<GradientStop Color="Red" Offset="1.0" />
</LinearGradientBrush>
</Window.Resources>
<Canvas Height="100">
<Rectangle Fill="{StaticResource Quarters}" Width="30" Height="100" Canvas.Bottom="0" Canvas.Left="0">
<Rectangle.Clip>
<RectangleGeometry x:Name="ClipRect" Rect="0, 100, 30, 100" />
</Rectangle.Clip>
</Rectangle>
</Canvas>
Код:
ClipRect.Rect = new Rect(0, 20, 30, 100); //80%
ClipRect.Rect = new Rect(0, 70, 30, 100); //30%
Используйте 2 прямоугольника для каждой полосы.
Один прямоугольник с высотой 100% и цветным градиентом. Затем наложите черный прямоугольник на первый прямоугольник. Отрегулируйте высоту черного прямоугольника (как и раньше), чтобы выставить градиент внизу.
например, если значение равно 25%, установите высоту наложения на 75%
.Я решил аналогичную проблему с помощью обтравки. Создайте прямоугольники на 100% и заполните их кистью. Затем используйте обтравку, чтобы показать только часть прямоугольника, см. пример кода ниже, который показывает два прямоугольника:
<Window x:Class="GradientTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Window.Resources>
<LinearGradientBrush x:Key="Quarters" StartPoint="0,1" EndPoint="0,0">
<GradientStop Color="LightGreen" Offset="0.0" />
<GradientStop Color="Yellow" Offset="0.25" />
<GradientStop Color="Orange" Offset="0.5" />
<GradientStop Color="Red" Offset="0.75" />
</LinearGradientBrush>
</Window.Resources>
<Canvas Height="100">
<!--21%-->
<Rectangle Fill="{StaticResource Quarters}" Width="30" Height="100" Canvas.Bottom="0" Canvas.Left="0">
<Rectangle.Clip>
<RectangleGeometry Rect="0, 79, 30, 100" />
</Rectangle.Clip>
</Rectangle>
<!--68%-->
<Rectangle Fill="{StaticResource Quarters}" Width="30" Height="100" Canvas.Bottom="0" Canvas.Left="40">
<Rectangle.Clip>
<RectangleGeometry Rect="0, 32, 30, 100" />
</Rectangle.Clip>
</Rectangle>
</Canvas>
</Window>