WPF之效果

来源:互联网 发布:魔力宝贝满档宠物数据 编辑:程序博客网 时间:2024/06/06 02:08

模糊效果:

        <Button Content="Blurred (Radius=2)" Padding="5" Margin="3">            <Button.Effect>                <BlurEffect Radius="2"></BlurEffect>            </Button.Effect>        </Button>        <Button Content="Blurred (Radius=5)" Padding="5" Margin="3">            <Button.Effect>                <BlurEffect Radius="5"></BlurEffect>            </Button.Effect>        </Button>        <Button Content="Blurred (Radius=20)" Padding="5" Margin="3">            <Button.Effect>                <BlurEffect Radius="20"></BlurEffect>            </Button.Effect>        </Button>
灰色效果:

    <StackPanel>        <Image Name="img" Margin="5" Source="harpsichord.jpg">            <Image.Effect>                <local:GrayscaleEffect></local:GrayscaleEffect>            </Image.Effect>        </Image>        <CheckBox Name="chkEffect" Margin="5" Content="Effect enabled" IsChecked="True" Click="chkEffect_Click"></CheckBox>            </StackPanel>
        public GrayscaleEffect()        {            Uri pixelShaderUri = new Uri("Grayscale_Compiled.ps",              UriKind.Relative);            // Load the information from the .ps file.            PixelShader = new PixelShader();            PixelShader.UriSource = pixelShaderUri;            UpdateShaderValue(InputProperty);        }        public static readonly DependencyProperty InputProperty =            ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(GrayscaleEffect), 0 /* assigned to sampler register S0 */);        public Brush Input        {            get { return (Brush)GetValue(InputProperty); }            set { SetValue(InputProperty, value); }        }
阴影效果:

    <StackPanel>        <TextBlock FontSize="20" Margin="5">            <TextBlock.Effect>                <DropShadowEffect></DropShadowEffect>            </TextBlock.Effect>            <TextBlock.Text>Basic dropshadow</TextBlock.Text>        </TextBlock>        <TextBlock FontSize="20" Margin="5">            <TextBlock.Effect>                <DropShadowEffect Color="SlateBlue"></DropShadowEffect>            </TextBlock.Effect>            <TextBlock.Text>Light blue dropshadow</TextBlock.Text>        </TextBlock>        <TextBlock FontSize="20" Foreground="White" Margin="5">            <TextBlock.Effect>                <DropShadowEffect BlurRadius="15"></DropShadowEffect>            </TextBlock.Effect>            <TextBlock.Text>Blurred dropshadow with white text</TextBlock.Text>        </TextBlock>        <TextBlock FontSize="20" Foreground="Magenta" Margin="5">            <TextBlock.Effect>                <DropShadowEffect ShadowDepth="0"></DropShadowEffect>            </TextBlock.Effect>            <TextBlock.Text>Close dropshadow</TextBlock.Text>        </TextBlock>        <TextBlock FontSize="20" Foreground="LimeGreen" Margin="5">            <TextBlock.Effect>                <DropShadowEffect ShadowDepth="25"></DropShadowEffect>            </TextBlock.Effect>            <TextBlock.Text>Distant dropshadow</TextBlock.Text>        </TextBlock>    </StackPanel>
生成位图:

    <Grid x:Name="LayoutRoot" Background="White">        <Grid.RowDefinitions>            <RowDefinition Height="Auto"></RowDefinition>            <RowDefinition></RowDefinition>        </Grid.RowDefinitions>        <Button Content="Button" Grid.Row="1" Height="81" HorizontalAlignment="Left" Margin="106,90,0,0" Name="button1" VerticalAlignment="Top" Width="193" />        <Button Content="Generate Bitmap" Width="120" Margin="5" Padding="10" Click="cmdGenerate_Click" HorizontalAlignment="Center"></Button>        <Image Grid.Row="1" x:Name="img" Margin="5" Width="400" Height="300" IsHitTestVisible="False"></Image>    </Grid>
        private void cmdGenerate_Click(object sender, RoutedEventArgs e)        {            // Create the bitmap, with the dimensions of the image placeholder.            WriteableBitmap wb = new WriteableBitmap((int)img.Width,                (int)img.Height, 96, 96, PixelFormats.Bgra32, null);                        // Define the update square (which is as big as the entire image).            Int32Rect rect = new Int32Rect(0, 0, (int)img.Width, (int)img.Height);            byte[] pixels = new byte[(int)img.Width * (int)img.Height * wb.Format.BitsPerPixel / 8];            Random rand = new Random();            for (int y = 0; y < wb.PixelHeight; y++)             {                for (int x = 0; x < wb.PixelWidth; x++)                {                    int alpha = 0;                    int red = 0;                    int green = 0;                    int blue = 0;                    // Determine the pixel's color.                    if ((x % 5 == 0) || (y % 7 == 0))                    {                        red = (int)((double)y / wb.PixelHeight * 255);                        green = rand.Next(100, 255);                        blue = (int)((double)x / wb.PixelWidth * 255);                        alpha = 255;                    }                    else                    {                        red = (int)((double)x / wb.PixelWidth * 255);                        green = rand.Next(100, 255);                        blue = (int)((double)y / wb.PixelHeight * 255);                        alpha = 50;                    }                    int pixelOffset = (x + y * wb.PixelWidth) * wb.Format.BitsPerPixel/8;                    pixels[pixelOffset] = (byte)blue;                    pixels[pixelOffset + 1] = (byte)green;                    pixels[pixelOffset + 2] = (byte)red;                    pixels[pixelOffset + 3] = (byte)alpha;                                                       }                int stride = (wb.PixelWidth * wb.Format.BitsPerPixel) / 8;                wb.WritePixels(rect, pixels, stride, 0);            }            // Show the bitmap in an Image element.            img.Source = wb;        }             private void cmdGenerate2_Click(object sender, RoutedEventArgs e)        {                              // Create the bitmap, with the dimensions of the image placeholder.            WriteableBitmap wb = new WriteableBitmap((int)img.Width,                 (int)img.Height, 96, 96, PixelFormats.Bgra32, null);                                    Random rand = new Random();            for (int x = 0; x < wb.PixelWidth; x++)            {                for (int y = 0; y < wb.PixelHeight; y++)                {                    int alpha = 0;                    int red = 0;                    int green = 0;                    int blue = 0;                                        // Determine the pixel's color.                    if ((x % 5 == 0) || (y % 7 == 0))                    {                        red = (int)((double)y / wb.PixelHeight * 255);                        green = rand.Next(100, 255);                        blue = (int)((double)x / wb.PixelWidth * 255);                        alpha = 255;                    }                    else                    {                                                red = (int)((double)x / wb.PixelWidth * 255);                        green = rand.Next(100, 255);                        blue = (int)((double)y / wb.PixelHeight * 255);                        alpha = 50;                    }                    // Set the pixel value.                                        byte[] colorData = { (byte)blue, (byte)green, (byte)red, (byte)alpha }; // B G R                                        Int32Rect rect = new Int32Rect(x,y, 1, 1);                    int stride = (wb.PixelWidth * wb.Format.BitsPerPixel) / 8;                    wb.WritePixels(rect, colorData, stride, 0);                                      //wb.WritePixels(.[y * wb.PixelWidth + x] = pixelColorValue;                }            }                                    // Show the bitmap in an Image element.            img.Source = wb;                                }
可视化层:

    <Grid>      <Grid.ColumnDefinitions>        <ColumnDefinition Width="Auto"></ColumnDefinition>        <ColumnDefinition></ColumnDefinition>      </Grid.ColumnDefinitions>      <ToolBarTray Orientation="Vertical">      <ToolBar>        <RadioButton Margin="0,3" Name="cmdSelectMove">          <StackPanel>            <Image Source="pointer.png" Width="35" Height="35"></Image>            <TextBlock>Select/Move</TextBlock>          </StackPanel>        </RadioButton>                <RadioButton Margin="0,3" IsChecked="True" Name="cmdAdd">          <StackPanel>            <Rectangle Width="30" Height="30" Stroke="SteelBlue" StrokeThickness="3" Fill="AliceBlue"></Rectangle>            <TextBlock>Add Square</TextBlock>          </StackPanel>        </RadioButton>        <RadioButton Margin="0,3" Name="cmdDelete">          <StackPanel>            <Path Stroke="SteelBlue" StrokeThickness="4" StrokeEndLineCap="Round" StrokeStartLineCap="Round"                  Fill="Red" HorizontalAlignment="Center">              <Path.Data>                <GeometryGroup>                  <PathGeometry>                    <PathFigure StartPoint="0,0">                      <LineSegment Point="18,18"></LineSegment>                    </PathFigure>                    <PathFigure StartPoint="0,18">                      <LineSegment Point="18,0"></LineSegment>                    </PathFigure>                  </PathGeometry>                </GeometryGroup>              </Path.Data>            </Path>            <TextBlock>Delete Square</TextBlock>          </StackPanel>        </RadioButton>        <RadioButton Margin="0,3" Name="cmdSelectMultiple">          <StackPanel>            <Image Source="pointer.png" Width="35" Height="35"></Image>            <TextBlock>Select Multiple</TextBlock>          </StackPanel>        </RadioButton>      </ToolBar>      </ToolBarTray>      <Border Grid.Column="1" Margin="3" BorderBrush="SteelBlue" BorderThickness="1">                <local:DrawingCanvas x:Name="drawingSurface" Background="White" ClipToBounds="True"                             MouseLeftButtonDown="drawingSurface_MouseLeftButtonDown"                MouseLeftButtonUp="drawingSurface_MouseLeftButtonUp"                MouseMove="drawingSurface_MouseMove">                  </local:DrawingCanvas>              </Border>    </Grid>
        public VisualLayer()        {            InitializeComponent();            DrawingVisual v = new DrawingVisual();            DrawSquare(v, new Point(10, 10), false);        }        // Variables for dragging shapes.        private bool isDragging = false;        private Vector clickOffset;        private DrawingVisual selectedVisual;        // Variables for drawing the selection square.        private bool isMultiSelecting = false;        private Point selectionSquareTopLeft;        private void drawingSurface_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)        {            Point pointClicked = e.GetPosition(drawingSurface);            if (cmdAdd.IsChecked == true)            {                DrawingVisual visual = new DrawingVisual();                DrawSquare(visual, pointClicked, false);                drawingSurface.AddVisual(visual);            }            else if (cmdDelete.IsChecked == true)            {                DrawingVisual visual = drawingSurface.GetVisual(pointClicked);                if (visual != null) drawingSurface.DeleteVisual(visual);            }            else if (cmdSelectMove.IsChecked == true)            {                DrawingVisual visual = drawingSurface.GetVisual(pointClicked);                if (visual != null)                {                    // Calculate the top-left corner of the square.                    // This is done by looking at the current bounds and                    // removing half the border (pen thickness).                    // An alternate solution would be to store the top-left                    // point of every visual in a collection in the                     // DrawingCanvas, and provide this point when hit testing.                    Point topLeftCorner = new Point(                        visual.ContentBounds.TopLeft.X + drawingPen.Thickness / 2,                        visual.ContentBounds.TopLeft.Y + drawingPen.Thickness / 2);                    DrawSquare(visual, topLeftCorner, true);                    clickOffset = topLeftCorner - pointClicked;                    isDragging = true;                    if (selectedVisual != null && selectedVisual != visual)                    {                        // The selection has changed. Clear the previous selection.                        ClearSelection();                    }                    selectedVisual = visual;                }            }            else if (cmdSelectMultiple.IsChecked == true)            {                selectionSquare = new DrawingVisual();                drawingSurface.AddVisual(selectionSquare);                selectionSquareTopLeft = pointClicked;                isMultiSelecting = true;                // Make sure we get the MouseLeftButtonUp event even if the user                // moves off the Canvas. Otherwise, two selection squares could be drawn at once.                drawingSurface.CaptureMouse();            }        }        // Drawing constants.        private Brush drawingBrush = Brushes.AliceBlue;        private Brush selectedDrawingBrush = Brushes.LightGoldenrodYellow;        private Pen drawingPen = new Pen(Brushes.SteelBlue, 3);        private Size squareSize = new Size(30, 30);        private DrawingVisual selectionSquare;        // Rendering the square.        private void DrawSquare(DrawingVisual visual, Point topLeftCorner, bool isSelected)        {                        using (DrawingContext dc = visual.RenderOpen())            {                Brush brush = drawingBrush;                if (isSelected) brush = selectedDrawingBrush;                                                                dc.DrawRectangle(brush, drawingPen,                    new Rect(topLeftCorner, squareSize));            }        }        private void drawingSurface_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)        {            isDragging = false;            if (isMultiSelecting)            {                // Display all the squares in this region.                RectangleGeometry geometry = new RectangleGeometry(                    new Rect(selectionSquareTopLeft, e.GetPosition(drawingSurface)));                List<DrawingVisual> visualsInRegion =                     drawingSurface.GetVisuals(geometry);                MessageBox.Show(String.Format("You selected {0} square(s).", visualsInRegion.Count));                isMultiSelecting = false;                drawingSurface.DeleteVisual(selectionSquare);                                drawingSurface.ReleaseMouseCapture();                            }                    }        private void ClearSelection()        {            Point topLeftCorner = new Point(                        selectedVisual.ContentBounds.TopLeft.X + drawingPen.Thickness / 2,                        selectedVisual.ContentBounds.TopLeft.Y + drawingPen.Thickness / 2);                    DrawSquare(selectedVisual, topLeftCorner, false);                    selectedVisual = null;        }        private void drawingSurface_MouseMove(object sender, MouseEventArgs e)        {            if (isDragging)            {                Point pointDragged = e.GetPosition(drawingSurface) + clickOffset;                DrawSquare(selectedVisual, pointDragged, true);            }            else if (isMultiSelecting)            {                Point pointDragged = e.GetPosition(drawingSurface);                DrawSelectionSquare(selectionSquareTopLeft, pointDragged);            }        }        private Brush selectionSquareBrush = Brushes.Transparent;        private Pen selectionSquarePen = new Pen(Brushes.Black, 2);                private void DrawSelectionSquare(Point point1, Point point2)        {            selectionSquarePen.DashStyle = DashStyles.Dash;            using (DrawingContext dc = selectionSquare.RenderOpen())            {                dc.DrawRectangle(selectionSquareBrush, selectionSquarePen,                    new Rect(point1, point2));            }        }

    public class DrawingCanvas : Panel    {        private List<Visual> visuals = new List<Visual>();        protected override Visual GetVisualChild(int index)        {            return visuals[index];        }        protected override int VisualChildrenCount        {            get            {                return visuals.Count;            }        }        public void AddVisual(Visual visual)        {            visuals.Add(visual);            base.AddVisualChild(visual);            base.AddLogicalChild(visual);        }        public void DeleteVisual(Visual visual)        {            visuals.Remove(visual);            base.RemoveVisualChild(visual);            base.RemoveLogicalChild(visual);                    }        public DrawingVisual GetVisual(Point point)        {            HitTestResult hitResult = VisualTreeHelper.HitTest(this, point);            return hitResult.VisualHit as DrawingVisual;                    }        private List<DrawingVisual> hits = new List<DrawingVisual>();        public List<DrawingVisual> GetVisuals(Geometry region)        {            hits.Clear();            GeometryHitTestParameters parameters = new GeometryHitTestParameters(region);            HitTestResultCallback callback = new HitTestResultCallback(this.HitTestCallback);            VisualTreeHelper.HitTest(this, null, callback, parameters);            return hits;        }        private HitTestResultBehavior HitTestCallback(HitTestResult result)        {            GeometryHitTestResult geometryResult = (GeometryHitTestResult)result;            DrawingVisual visual = result.VisualHit as DrawingVisual;            if (visual != null &&                geometryResult.IntersectionDetail == IntersectionDetail.FullyInside)            {                hits.Add(visual);            }            return HitTestResultBehavior.Continue;        }    }