Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 设置a<;StackPanel>;用刷子刷背景色_Wpf_Brush - Fatal编程技术网

Wpf 设置a<;StackPanel>;用刷子刷背景色

Wpf 设置a<;StackPanel>;用刷子刷背景色,wpf,brush,Wpf,Brush,因此,我创建了一个带有滑块、滚动条和整数按钮的设计,它们都绑定在一起,同时移动,并且具有相同的值。我每个都有一个,每个ARGB一个。我有一个stackPanel在中间,当任何工具被修改时,背景颜色应该改变 就我所想,我只需要知道其中一个工具值,以便通过它们提供的数据设置背景。。。但我如何实现这一点 到目前为止,我已经编写了以下代码: public partial class MainWindow : Window { SolidColorBrush brush; public

因此,我创建了一个带有滑块、滚动条和整数按钮的设计,它们都绑定在一起,同时移动,并且具有相同的值。我每个都有一个,每个ARGB一个。我有一个stackPanel在中间,当任何工具被修改时,背景颜色应该改变

就我所想,我只需要知道其中一个工具值,以便通过它们提供的数据设置背景。。。但我如何实现这一点

到目前为止,我已经编写了以下代码:

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"
                />


滑块没有绑定,因为据我所知,它们是双向的。它们都没有给出错误。

为颜色的四个组件创建一个具有四字节属性的视图模型,并为结果颜色值创建一个具有
颜色
属性的视图模型

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>


Color是一个结构,而不是一个类。必须像这样分配新的颜色值:
brush.Color=Color.FromArgb((字节)scbScrollA.value,brush.Color.R,brush.Color.G,brush.Color.B)这是WPF,不是WinForms。使用数据绑定,而不是事件处理程序;-)例如,您可以对StackPanel.Background属性使用
。多重绑定将针对滚动条控件的4值属性进行绑定。多重绑定还必须使用多重值转换器,将多重绑定中的4个值转换为颜色/笔刷。您需要实现此多值转换器(基于
IMultiValueConverter
)。如果你不知道多重绑定,网络搜索肯定会产生大量的博客文章和教程…@Clemens我怎么能做到你说的?我更改了构造函数:“brush=new SolidColorBrush();brush.Color=Color.FromArgb((字节)scbScrollA.Value,(字节)scbScrollR.Value,(字节)scbScrollG.Value,(字节)scbScrollB.Value);stkColor.Background=画笔;'将该代码放入滚动事件处理程序。滚动事件仅在移动滚动条的拇指时调用。改为使用其ValueChanged事件。除此之外,最好将所有控件属性绑定到视图模型,并更新其中的颜色。按公共属性返回颜色值。