WPF之效果
2013-11-30 19:45
148 查看
模糊效果:
<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>
<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>
<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>
<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; } } 4000 // 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; } }
相关文章推荐
- wpf 窗体翻页效果
- WPF中创建水晶动画效果的treeview控件
- WPF实现射线效果动画
- wpf中给一个三维模型设置多种材质效果
- WPF控件状态的过渡效果
- WPF实现淡入淡出效果
- Wpf 实现拖拽效果
- [WPF] 圆形等待效果
- WPF字体输入倒影效果
- 好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果
- WPF编游戏系列 之六 动画效果(1)
- WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果
- WPF气泡样式弹窗效果代码分享
- WPF 实现水纹效果
- WPF,Silverlight与XAML读书笔记第四十六 - 外观效果之三皮肤与主题
- WPF-画刷、绘图、几何绘图、图形的效果与滤镜、图形变换和动画
- [WPF] 如何为无边框窗口设置阴影效果
- WPF仿微软事件和属性窗体,效果更炫!
- 好玩的WPF第一弹:窗口抖动+边框阴影效果+倒计时显示文字
- c#,使用WPF实现iPhone的短信框效果