How can I convert the values of three sliders into a Color?

前端 未结 2 1321
执念已碎
执念已碎 2020-12-22 07:29

I\'m trying to create a custom user control that will allow a user to define a color in WPF. I\'ve done this before in WinForms but in WPF it seems to be not as straight for

2条回答
  •  一生所求
    2020-12-22 07:41

    Okay - I want to thank everyone for their help; I was finally able to come up with a solution - in the event anyone is interested or stumbles upon this, it's also a good lesson in MVVM (maybe; I don't know...).

    Anyway :

    This is the MVVM I implemented :

    public class ColorViewModel : INotifyPropertyChanged {
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        private Color _Color = Colors.Black;
    
        public double A {
            get { return this.Color.ScA; }
            set {
                this._Color.ScA = ( float )value;
                if ( this.PropertyChanged != null ) {
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "A" ) );
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "Color" ) );
                }
            }
        }
        public double R {
            get { return this.Color.ScR; }
            set {
                this._Color.ScR = ( float )value;
                if ( this.PropertyChanged != null ) {
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "R" ) );
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "Red" ) );
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "Color" ) );
                }
            }
        }
        public double G {
            get { return this.Color.ScG; }
            set {
                this._Color.ScG = ( float )value;
                if ( this.PropertyChanged != null ) {
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "G" ) );
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "Green" ) );
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "Color" ) );
                }
            }
        }
        public double B {
            get { return this._Color.ScB; }
            set {
                this._Color.ScB = ( float )value;
                if ( this.PropertyChanged != null ) {
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "B" ) );
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "Blue" ) );
                    this.PropertyChanged( this, new PropertyChangedEventArgs( "Color" ) );
                }
            }
        }
    
        public Color Color {
            get { return this._Color; }
            set {
                this._Color = value;
                if ( this.PropertyChanged != null )
                    this.AllChanged( );
            }
        }
        public Color Red { get { return Color.FromScRgb( 1.0F, ( float )this.R, 0.0F, 0.0F ); } }
        public Color Green { get { return Color.FromScRgb( 1.0F, 0.0F, ( float )this.G, 0.0F ); } }
        public Color Blue { get { return Color.FromScRgb( 1.0F, 0.0F, 0.0F, ( float )this.B ); } }
    
        private void AllChanged( ) {
            this.PropertyChanged( this, new PropertyChangedEventArgs( "A" ) );
            this.PropertyChanged( this, new PropertyChangedEventArgs( "R" ) );
            this.PropertyChanged( this, new PropertyChangedEventArgs( "G" ) );
            this.PropertyChanged( this, new PropertyChangedEventArgs( "B" ) );
            this.PropertyChanged( this, new PropertyChangedEventArgs( "Red" ) );
            this.PropertyChanged( this, new PropertyChangedEventArgs( "Green" ) );
            this.PropertyChanged( this, new PropertyChangedEventArgs( "Blue" ) );
            this.PropertyChanged( this, new PropertyChangedEventArgs( "Color" ) );
        }
    }
    

    This is the control class :

    public partial class ColorDefiner : UserControl {
    
        public static readonly DependencyProperty
            _Color = DependencyProperty.Register( "Color", typeof( Color ), typeof( ColorDefiner ) );
    
        public Color Color {
            get { return ( Color )this.GetValue( ColorDefiner._Color ); }
            set { this.SetValue( ColorDefiner._Color, value ); }
        }
    
        private ColorViewModel CVM { get { return this.DataContext as ColorViewModel; } }
    
        public ColorDefiner( ) {
            InitializeComponent( );
            Binding B = new Binding( "Color" ) { Source = this.DataContext };
            this.SetBinding( ColorDefiner._Color, B );
        }
    }
    

    This is the XAML for the User Control (yes, I did it with a UserControl; this required a data context, and I really don't want to fuss with that yet in a Custom Control - this is really only going to be my own personal control for my own use anyway) :

    
        
            
        
        
            
                
                
                
                
            
            
                
                
                
            
            
                
                    
                        
                    
                
            
            
                
                    
                        
                    
                
            
            
                
                    
                        
                    
                
            
            
                
                    
                        
                    
                
            
            
                
            
            
                
            
            
                
            
            
                
            
        
    
    

    I bound the Brush Color of the Labels to their respective colors in the View Model (A got the entire thing). I Two-Way Bound the value of each slider to it's respective value within the view model, and in the code I bound the Dependency Property to the view model Color property. I tested this, and it worked.

    Once again, thank you all for your help.

提交回复
热议问题