【问题标题】:WPF: Color under the pointerWPF:指针下的颜色
【发布时间】:2010-12-20 17:24:33
【问题描述】:

我有一个带有渐变背景的控件。在MouseDownMouseUp 事件中,我想立即捕捉鼠标指针下像素的颜色。我该怎么做?

【问题讨论】:

    标签: wpf


    【解决方案1】:

    我创建了一个可以附加到 Image 对象以获取颜色的行为,即 100% WPF。这是行为;可以对其进行调整以使用任何“视觉”,而不仅仅是图像。

    [注意:我为创建 RenderTargetBitmap 硬编码 96dpi...您的里程可能会有所不同]

    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    using System.Windows.Interactivity;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    
    namespace Company.Solution.Project.Utilities.Behaviors
    {
        [Description("Used to sample the color under mouse for the image when the mouse is pressed. ")]
        public class ImageBehaviorMouseDownPointSampleToColor : Behavior<Image>
        {
            public static readonly DependencyProperty SelectedColorProperty =
                DependencyProperty.Register("SelectedColor", typeof(Color),
                                            typeof(ImageBehaviorMouseDownPointSampleToColor),
                                            new UIPropertyMetadata(Colors.White));
    
    
            public Color SelectedColor
            {
                get { return (Color)GetValue(SelectedColorProperty); }
                set { SetValue(SelectedColorProperty, value); }
            }
    
    
            protected override void OnAttached()
            {
                base.OnAttached();
    
                AssociatedObject.MouseMove += AssociatedObject_MouseMove;
                AssociatedObject.MouseDown += AssociatedObject_MouseDown;
            }
    
            protected override void OnDetaching()
            {
                base.OnDetaching();
    
                AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
                AssociatedObject.MouseDown -= AssociatedObject_MouseDown;
            }
    
            private void AssociatedObject_MouseDown(object sender, MouseButtonEventArgs e)
            {
                SamplePixelForColor();
            }
    
            private void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.LeftButton == MouseButtonState.Pressed)
                {
                    SamplePixelForColor();
                }
            }
    
            private void SamplePixelForColor()
            {
                // Retrieve the coordinate of the mouse position in relation to the supplied image.
                Point point = Mouse.GetPosition(AssociatedObject);
    
                // Use RenderTargetBitmap to get the visual, in case the image has been transformed.
                var renderTargetBitmap = new RenderTargetBitmap((int)AssociatedObject.ActualWidth,
                                                                (int)AssociatedObject.ActualHeight,
                                                                96, 96, PixelFormats.Default);
                renderTargetBitmap.Render(AssociatedObject);
    
                // Make sure that the point is within the dimensions of the image.
                if ((point.X <= renderTargetBitmap.PixelWidth) && (point.Y <= renderTargetBitmap.PixelHeight))
                {
                    // Create a cropped image at the supplied point coordinates.
                    var croppedBitmap = new CroppedBitmap(renderTargetBitmap,
                                                          new Int32Rect((int)point.X, (int)point.Y, 1, 1));
    
                    // Copy the sampled pixel to a byte array.
                    var pixels = new byte[4];
                    croppedBitmap.CopyPixels(pixels, 4, 0);
    
                    // Assign the sampled color to a SolidColorBrush and return as conversion.
                    SelectedColor = Color.FromArgb(255, pixels[2], pixels[1], pixels[0]);
                }
             }        
          }        
       }
    

    【讨论】:

    • 似乎这会呈现AssociatedObject 而不是鼠标下的任何内容。
    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2013-12-02
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多