Фиксированный градиент с движущимся прямоугольником?

У меня есть WPF 'виджет монитора', который отображает ЦП, RAM и производительность диска как панели небольшого процента. Я использую следующий градиент в качестве ресурса для деления панелей на 4 раздела (т.е. 0% - 25%, 25% - 50%, и т.д.)


    
    
    
    
    
    
    
    

Первоначально, 0%-е положение панелей было наверху (панель. Высота = 0) и 100% была внизу (панель. Высота = 15). Размер панели изменился бы путем простой корректировки его свойства Height. Все хорошо работало, но я предпочту, чтобы 0%-е положение панелей было внизу вместо этого, т.е. панели 'станут' восходящими.

То, чтобы заставлять панели стать восходящим не было никакой проблемой, но проблема, которую я действительно имею, состоит в том, что градиент теперь перемещается с прямоугольником, так, чтобы вершина прямоугольника была всегда зеленой, неважно, насколько маленький это. Я понимаю, что это вызвано тем, что я теперь использую Холст. SetTop, чтобы переместить вершину прямоугольников (панели), а также изменить их высоту. Как я могу вызвать градиент к абсолютной позиции, независимо от положения прямоугольника?

MonitorWidgetalt text (фоновая непрозрачность)

Извините, я знаю, что изображение является маленьким, но необходимо просто смочь разобрать, что средняя панель начинает с главного (зеленого) и становится нисходящей, заканчивающийся в оранжевом (50%-е-75% значение). Левая панель запускается внизу (это - то, что я хочу), но градиент в этой панели перемещается с высотой... это - проблема. Обратите внимание, что я инвертирую градиент, когда я смогу решить эту проблему, так, чтобы красный представил лучшие 25%. В этом примере нижняя четверть должна быть красной, следующий оранжевый квартал и желтый остаток.

Я не могу полагать, что нет никакого простого решения для этого... прибывают в черепные коробки.:) Как насчет того, чтобы переместить абсолютное положение градиента с прямоугольником... это возможное???

(Связывающий сообщение: Определение максимальной скорости передачи данных жесткого диска компьютера программно с C#)

1
задан Community 23 May 2017 в 12:01
поделиться

2 ответа

Обновление

Обрезать прямоугольник со значениями, заданными во время выполнения.

    <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%

.
1
ответ дан 2 September 2019 в 23:15
поделиться

Я решил аналогичную проблему с помощью обтравки. Создайте прямоугольники на 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>
1
ответ дан 2 September 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: