Установка <StackPanel>цвета фона с помощью кисти - PullRequest
0 голосов
/ 10 ноября 2018

Итак, я создал дизайн с ползунками, scrollBars и IntegerUpDowns, которые все вместе связаны вместе и имеют одинаковое значение. Я имею для каждого, один для каждого ARGB. У меня в центре находится stackPanel, который должен изменить BackgroundColor при изменении любого из инструментов.

Насколько я думал об этом, мне просто нужно знать одно из значений инструментов, чтобы установить фон с помощью данных, которые они доставляют ... Но как я могу это реализовать?

Пока я закодировал это:

public partial class MainWindow : Window
{
    SolidColorBrush brush;

    public MainWindow()
    {
        InitializeComponent();

        brush = new SolidColorBrush();
        brush.Color = Color.FromArgb(0, 0, 0, 0);
        stkColor.Background = brush;
    }

    private void scbScrollA_Scroll(object sender, System.Windows.Controls.Primitives.ScrollEventArgs e)
    {
        brush.Color.A = scbScrollA.Value(); //doesn't work
    }

    private void scbScrollR_Scroll(object sender, System.Windows.Controls.Primitives.ScrollEventArgs e)
    {

    }

    private void scbScrollG_Scroll(object sender, System.Windows.Controls.Primitives.ScrollEventArgs e)
    {

    }

    private void scbScrollB_Scroll(object sender, System.Windows.Controls.Primitives.ScrollEventArgs e)
    {

    }
}

Как я уже сказал, просто зная данные прокрутки, поскольку я использовал привязки со всеми остальными инструментами, мне удалось установить цвет и обновлять каждый раз, когда любые данные модифицируются.

У меня есть привязки:

<xctk:IntegerUpDown Grid.Column="7" Grid.Row="0" x:Name="iudB" Increment="10" Minimum="0" Maximum="255"
                                Value="{Binding ElementName=scbScrollB, Path=Value}"
                                />

<ScrollBar Grid.Column="1" Grid.Row="6" Grid.RowSpan="2" Width="Auto" Orientation="Horizontal" 
                   Minimum="0" Maximum="255" x:Name="scbScrollB" 
                   Scroll="scbScrollB_Scroll" SmallChange="1" 
                   LargeChange="10" Value="{Binding ElementName=sliderB, Path=Value}"
                   />

<Slider 
                Grid.Column="6" Grid.Row="1" Grid.RowSpan="1"
                Orientation="Vertical"
                LargeChange="10" 
                Maximum="255" 
                SmallChange="1" 
                TickPlacement="TopLeft" 
                Minimum="0" 
                TickFrequency="25"
                x:Name="sliderB"
                />

У слайдера нет привязки, потому что, насколько я знаю, они двунаправлены. Никто из них не дает ошибки.

1 Ответ

0 голосов
/ 11 ноября 2018

Создайте модель представления с четырьмя байтовыми свойствами для четырех компонентов цвета и свойством Color для результирующего значения цвета.

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private byte alpha;
    private byte red;
    private byte green;
    private byte blue;

    private void NotifyPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private void SetColorComponent(ref byte field, byte value, string propertyName)
    {
        if (field != value)
        {
            field = value;
            NotifyPropertyChanged(propertyName);
            NotifyPropertyChanged(nameof(Color));
        }
    }

    public byte Alpha
    {
        get { return alpha; }
        set { SetColorComponent(ref alpha, value, nameof(Alpha)); }
    }

    public byte Red
    {
        get { return red; }
        set { SetColorComponent(ref red, value, nameof(Red)); }
    }

    public byte Green
    {
        get { return green; }
        set { SetColorComponent(ref green, value, nameof(Green)); }
    }

    public byte Blue
    {
        get { return blue; }
        set { SetColorComponent(ref blue, value, nameof(Blue)); }
    }

    public Color Color
    {
        get { return Color.FromArgb(alpha, red, green, blue); }
    }
}

Назначьте экземпляр модели представления для DataContext окна и привяжите ползунки, полосы прокрутки и т. Д. К свойствам модели представления.

<Window ...>
    <Window.DataContext>
        <local:ViewModel/>
    </Window.DataContext>
    <StackPanel>
        <StackPanel.Background>
            <SolidColorBrush Color="{Binding Color}"/>
        </StackPanel.Background>

        <Slider Minimum="0" Maximum="255" Value="{Binding Alpha}"/>
        <Slider Minimum="0" Maximum="255" Value="{Binding Red}"/>
        <Slider Minimum="0" Maximum="255" Value="{Binding Green}"/>
        <Slider Minimum="0" Maximum="255" Value="{Binding Blue}"/>

        <ScrollBar Minimum="0" Maximum="255" Value="{Binding Alpha}" Orientation="Horizontal"/>
        <ScrollBar Minimum="0" Maximum="255" Value="{Binding Red}" Orientation="Horizontal"/>
        <ScrollBar Minimum="0" Maximum="255" Value="{Binding Green}" Orientation="Horizontal"/>
        <ScrollBar Minimum="0" Maximum="255" Value="{Binding Blue}" Orientation="Horizontal"/>
    </StackPanel>
</Window>
...