WPF Image控件

1.只是显示图片

string path = 相对路径

         path =绝对路径

BitmapImage image = new BitmapImage(new Uri(path, UriKind.Absolute));
img.Source = image;

2.在另一段代码中,要删除这个图片

就需要先把图片转换成文件流,在当前读取流完时,关闭流,当要删除图片时释放资源,修改代码如下:

System.IO.FileStream m_ImageStream;
        string path;

string path = 相对路径

         path =绝对路径

BitmapImage image = new BitmapImage();
m_ImageStream = new System.IO.FileStream(path, FileMode.Open);
image.BeginInit();
image.StreamSource = m_ImageStream;
image.EndInit();

img.Source = image;

删除代码:

if (m_ImageStream != null)
            {
                m_ImageStream.Close();
                m_ImageStream.Dispose();
            }
            if (System.IO.File.Exists(path))
            {
                System.IO.File.Delete(path);
                BitmapImage i = new BitmapImage();//虽然点了删除,可是图片还显示在窗体里,这时要想重新刷新,给image控件赋值一个空的图片
                img.Source = i;
            }

### WPF Image 控件的二次开发与功能扩展 在 WPF 中,`Image` 控件是一个用于显示位图或矢量图形的核心控件。然而,在实际应用中,可能需要对其功能进行扩展以满足特定需求。这种情况下可以通过继承 `Image` 或者利用附加行为来实现。 #### 方法一:通过继承 `Image` 实现功能扩展 创建一个新的类并继承自 `System.Windows.Controls.Image` 是一种常见的方法。可以在新类中添加额外的功能逻辑或者依赖属性[^1]。以下是具体步骤: 1. **定义新的控件类** 创建一个名为 `CustomImage` 的类,并使其继承自 `Image`。 2. **添加自定义功能** 在此过程中可以引入新的事件、命令或者其他交互机制。例如,如果希望当鼠标悬停时改变图片透明度,则可重写 `OnMouseEnter` 和 `OnMouseLeave` 方法。 ```csharp public class CustomImage : System.Windows.Controls.Image { public static readonly DependencyProperty HoverOpacityProperty = DependencyProperty.Register("HoverOpacity", typeof(double), typeof(CustomImage), new FrameworkPropertyMetadata(0.7d)); public double HoverOpacity { get { return (double)GetValue(HoverOpacityProperty); } set { SetValue(HoverOpacityProperty, value); } } protected override void OnMouseEnter(MouseEventArgs e) { base.OnMouseEnter(e); this.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation(this.Opacity, this.HoverOpacity, TimeSpan.FromSeconds(0.3))); } protected override void OnMouseLeave(MouseEventArgs e) { base.OnMouseLeave(e); this.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation(this.Opacity, 1.0, TimeSpan.FromSeconds(0.3))); } } ``` 此处展示了如何向标准 `Image` 添加鼠标的进入离开动画效果[^1]。 #### 方法二:使用 Behavior 来增强现有控件的行为 另一种方式是不修改原生控件本身而是借助于 Blend SDK 提供的 Behaviors 功能。这种方式更加灵活且不会破坏原有控件结构。 下面的例子展示了一个简单的 Behavior 定义,它使得任何关联它的目标都能支持点击放大缩小的效果。 ```xml <Window.Resources> <local:ZoomBehavior x:Key="zoomBehavior"/> </Window.Resources> <Image Source="example.jpg"> <i:Interaction.Behaviors> <StaticResource ResourceKey="zoomBehavior"/> </i:Interaction.Behaviors> </Image> ``` 对应的 C# 行为代码如下所示: ```csharp using Microsoft.Xaml.Behaviors; public class ZoomBehavior : Behavior<System.Windows.Controls.Image> { private ScaleTransform _scaleTransform; protected override void OnAttached() { AssociatedObject.MouseWheel += HandleMouseWheel; var transformGroup = new TransformGroup(); _scaleTransform = new ScaleTransform() {ScaleX=1, ScaleY=1}; transformGroup.Children.Add(_scaleTransform); AssociatedObject.RenderTransform = transformGroup; } private void HandleMouseWheel(object sender, MouseWheelEventArgs e) { if (_scaleTransform != null && !e.Handled) { const double zoomFactor = .1; Point relativePoint = e.GetPosition(AssociatedObject); _scaleTransform.ScaleX *= Math.Pow((double)(e.Delta > 0 ? 1 + zoomFactor : 1 - zoomFactor), .1); _scaleTransform.ScaleY = _scaleTransform.ScaleX; } } } ``` 以上实现了基于滚轮操作调整图像大小的能力[^2]。 #### 总结 无论是采用子类化还是行为模式都可以有效完成对 WPF 原始组件的功能扩充工作。前者适合那些频繁使用的定制版本;后者则适用于临时性的特殊场合下的快速部署解决方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值