WPF自定义控件之ItemsControl鱼眼效果

这篇具有很好参考价值的文章主要介绍了WPF自定义控件之ItemsControl鱼眼效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原理

先获取鼠标在控件中的坐标,在获取其每一项相对于ItemsControl的坐标,然后计算每一项离当前鼠标的距离,在根据这个距离,对其每一项进行适当的缩放

实现

创建一个类,命名为FishEyeItemsControl

 public class FishEyeItemsControl : ItemsControl 

添加应用鱼眼效果方法(控制其控件的缩放)

private void ApplyFishEyeEffect(UIElement element, double strength, double additionalScale = 0.0)
{
    // 将鱼眼效果应用于控件的正中心位置

    // 获取控件的宽度和高度
    double width = element.RenderSize.Width;
    double height = element.RenderSize.Height;

    // 计算控件的正中心位置
    double centerX = width / 2.0;
    double centerY = height / 2.0;

    // 创建 ScaleTransform 对象并设置缩放中心为控件的正中心
    ScaleTransform scaleTransform = new ScaleTransform();
    scaleTransform.CenterX = centerX;
    scaleTransform.CenterY = centerY;

    // 根据强度调整缩放比例
    scaleTransform.ScaleX = strength + additionalScale;
    scaleTransform.ScaleY = strength + additionalScale;

    // 将 ScaleTransform 应用于控件的 RenderTransform
    element.RenderTransform = scaleTransform;
}

当鼠标移入到ItemsControl区域内时,计算其项距离鼠标距离,实现鱼眼效果

CalculateStrength方法可根据实际需求进行更改

protected override void OnMouseMove(MouseEventArgs e)
{
    base.OnMouseMove(e);
    Point mousePosition = e.GetPosition(this);
    hoveredIndex = -1;

    for (int i = 0; i < Items.Count; i++)
    {
        UIElement element = ItemContainerGenerator.ContainerFromIndex(i) as UIElement;

        if (element != null)
        {
            Point itemPosition = element.TranslatePoint(new Point(element.RenderSize.Width / 2, element.RenderSize.Height / 2), this);
            double distance = CalculateDistance(mousePosition, itemPosition);
            double strength = CalculateStrength(distance);

            ApplyFishEyeEffect(element, strength, Scale);

            if (distance < element.RenderSize.Width)
            {
                hoveredIndex = i;
            }
        }
    }
}

private double CalculateDistance(Point p1, Point p2)
{
    double dx = p1.X - p2.X;
    double dy = p1.Y - p2.Y;
    return Math.Sqrt(dx * dx + dy * dy);
}

private double CalculateStrength(double distance)
{
    // 根据距离计算变换的强度
    var strength = 1.0;
    strength = Math.Exp(-distance / 100);
    return strength;
}

当鼠标离开ItemsControl时,进行效果还原

protected override void OnMouseLeave(MouseEventArgs e)
{
    base.OnMouseLeave(e);

    for (int i = 0; i < Items.Count; i++)
    {
        UIElement element = ItemContainerGenerator.ContainerFromIndex(i) as UIElement;

        if (element != null)
        {
            ApplyFishEyeEffect(element, 1.0);
        }
    }
    hoveredIndex = -1;
}

添加背景色,如果未设置,当鼠标处于两个项之间的空间会触发OnMouseLeave

 

public FishEyeItemsControl()
{
    this.Background = Brushes.Transparent;
}

属性

依赖属性Scale是为了在Xaml中动态修改其效果

private int hoveredIndex = -1;

#region DependencyProperty

public double Scale
{
    get { return (double)GetValue(ScaleProperty); }
    set { SetValue(ScaleProperty, value); }
}

// Using a DependencyProperty as the backing store for Scale.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty ScaleProperty =
    DependencyProperty.Register("Scale", typeof(double), typeof(FishEyeItemsControl), new FrameworkPropertyMetadata(1.0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

#endregion

Xaml

  <zWorkUi:FishEyeItemsControl
      Width="800"
      Height="600"
      ItemsSource="{Binding TestList}">
      <zWorkUi:FishEyeItemsControl.ItemsPanel>
          <ItemsPanelTemplate>
              <WrapPanel />
          </ItemsPanelTemplate>
      </zWorkUi:FishEyeItemsControl.ItemsPanel>
      <zWorkUi:FishEyeItemsControl.ItemTemplate>
          <DataTemplate>
              <Border
                  Width="50"
                  Height="50"
                  Margin="20,20"
                  Background="Red" />
          </DataTemplate>
      </zWorkUi:FishEyeItemsControl.ItemTemplate>
  </zWorkUi:FishEyeItemsControl>

 

效果

鼠标未进入区域时

效果1

WPF自定义控件之ItemsControl鱼眼效果

效果2

WPF自定义控件之ItemsControl鱼眼效果

 鼠标进入区域,移到某一项上时

效果1

WPF自定义控件之ItemsControl鱼眼效果

效果2

WPF自定义控件之ItemsControl鱼眼效果文章来源地址https://www.toymoban.com/news/detail-761476.html

到了这里,关于WPF自定义控件之ItemsControl鱼眼效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WPF自定义按钮控件

    在平时的WPF应用中,系统提供的按钮控件确实可以实现正常的逻辑,但是从视觉方面看的话,确实不够美观,而且每个项目的UI设计不尽相同。那么自定义按钮控件就是必须的了,网上查找了很多自定义按钮控件的办法,但每次都是写到一半就报错。在参考了多个技术贴之后

    2024年02月08日
    浏览(35)
  • wpf 自定义combox控件

    关键步骤 1、新建usercontrol使用基本的控件进行设计 2、依赖属性的定义,目的:外部调用时候能够使用属性进行控件样式的控制 例如 Width=\\\"200\\\" DisplayMemberPath=\\\"Name\\\" SelectedItem=\\\"{Binding SelectedItem,Mode=TwoWay}\\\" SelectionChanged=\\\"{Binding ProjectSelectCommand}\\\" CommandParameter=\\\"{Binding ElementName = Projec

    2024年02月09日
    浏览(32)
  • WPF 获取父容器控件的宽度

    在WPF中,如果你想要获取一个控件的父容器(Parent)的宽度,你可以通过以下方式访问: 这里的 this 指的是当前控件实例。 .Parent 属性返回直接父容器, .ActualWidth 则是获取该父容器的实际渲染宽度。 如果你需要获取更高级别的祖先容器的宽度,或者是在代码后面绑定到某个

    2024年01月17日
    浏览(21)
  • C# wpf 获取控件刷新的时机

    做wpf开发不像mfc控件的刷新相对同步,wpf的控件改变宽高或者可见性后在下一行代码不会立刻看到效果,而且也没有一种事件可以获取确切的界面刷新后的时机。如果只是进行延迟等待,在不同机器效果是不同的,而且也并没有具体标识说明已刷新界面,这就导致某些场景的

    2024年01月17日
    浏览(38)
  • wpf 为自定义控件添加滚动条

    在WPF中为自定义控件添加滚动条通常涉及将自定义控件置于 ScrollViewer 控件内,并根据需要配置ScrollViewer的属性。以下是一个基本步骤说明: 创建自定义控件 :首先,你有一个自定义控件(比如名为 RWrapPanel ,继承自 WrapPanel 并实现 IScrollInfo 接口以进行平滑滚动管理)。 嵌

    2024年02月01日
    浏览(30)
  • wpf自定义控件-单/双箭头线

    using System; using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; namespace CustomControls { [TypeDescriptionProvider(typeof(CustomTypeDescriptionProvider))] public class CustomArrow : Shape { public CustomArrow () { Stroke= new SolidColorBrush(Color.FromRgb(0, 140, 206));

    2024年02月15日
    浏览(30)
  • WPF grid控件定义行和列

    在此已经学习了wpf Grid控件, WPF布局控件Grid的基本使用 - 使用kaxaml_bcbobo21cn的博客-CSDN博客 下面继续学习; 定义3行3列的基本代码如下;为了看清效果,设置 ShowGridLines=\\\"True\\\";   减少一列,效果如下;   只有行,没有列;   指定第一列的宽度;   第一列指定宽度,剩下2列

    2024年02月13日
    浏览(38)
  • WPF自定义嵌入弹框控件,支持内容标题自定义

    最近为了实现WPF中弹框组件写了一个小例子: 组件要求: 1.自定义标题 2自定义标题颜色 3提供关闭按钮, 4.弹框内容可由调用方自行嵌入 xaml代码 UserControl x:Class=\\\"WpfApp1.Controls.CustomPopup\\\"              xmlns=\\\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\\\"              xmlns:x=\\\"

    2024年02月16日
    浏览(33)
  • WPF --- 非Button自定义控件实现点击功能

    今天在做一个设置文件夹路径的功能,就是一个文本框,加个按钮,点击按钮,弹出 FolderBrowserDialog 再选择文件夹路径,简单做法,可以直接 StackPanel 横向放置一个 TextBox 和一个 Image Button ,然后点击按钮在 后台代码中给 ViewModel 的 FilePath 赋值。但是这样属实不够优雅,UI 不

    2024年02月12日
    浏览(31)
  • 在 WPF 为你的自定义控件添加属性

    首先,在你的自定义控件类 (示例: UserControl1 ) 添加以下代码: 以上代码简化了官方方法的流程,以便你不用再去额外输入不必要的参数,并提前对 sender 进行类型转换。 此后,添加一个属性只需要添加以下代码即可,相比传统方法看起来会非常直观,非常省事。 以上代码中

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包