最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF自定義控件實(shí)現(xiàn)ItemsControl魚(yú)眼效果

 更新時(shí)間:2024年01月03日 09:37:55   作者:阿金啊  
這篇文章主要為大家詳細(xì)介紹了WPF如何通過(guò)自定義控件實(shí)現(xiàn)ItemsControl魚(yú)眼效果,文中的示例代碼講解詳細(xì),需要的可以參考一下

原理

先獲取鼠標(biāo)在控件中的坐標(biāo),在獲取其每一項(xiàng)相對(duì)于ItemsControl的坐標(biāo),然后計(jì)算每一項(xiàng)離當(dāng)前鼠標(biāo)的距離,在根據(jù)這個(gè)距離,對(duì)其每一項(xiàng)進(jìn)行適當(dāng)?shù)目s放

實(shí)現(xiàn)

創(chuàng)建一個(gè)類(lèi),命名為FishEyeItemsControl

public class FishEyeItemsControl : ItemsControl 

添加應(yīng)用魚(yú)眼效果方法(控制其控件的縮放)

private void ApplyFishEyeEffect(UIElement element, double strength, double additionalScale = 0.0)
{
    // 將魚(yú)眼效果應(yīng)用于控件的正中心位置

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

    // 計(jì)算控件的正中心位置
    double centerX = width / 2.0;
    double centerY = height / 2.0;

    // 創(chuàng)建 ScaleTransform 對(duì)象并設(shè)置縮放中心為控件的正中心
    ScaleTransform scaleTransform = new ScaleTransform();
    scaleTransform.CenterX = centerX;
    scaleTransform.CenterY = centerY;

    // 根據(jù)強(qiáng)度調(diào)整縮放比例
    scaleTransform.ScaleX = strength + additionalScale;
    scaleTransform.ScaleY = strength + additionalScale;

    // 將 ScaleTransform 應(yīng)用于控件的 RenderTransform
    element.RenderTransform = scaleTransform;
}

當(dāng)鼠標(biāo)移入到ItemsControl區(qū)域內(nèi)時(shí),計(jì)算其項(xiàng)距離鼠標(biāo)距離,實(shí)現(xiàn)魚(yú)眼效果

CalculateStrength方法可根據(jù)實(shí)際需求進(jìn)行更改

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)
{
    // 根據(jù)距離計(jì)算變換的強(qiáng)度
    var strength = 1.0;
    strength = Math.Exp(-distance / 100);
    return strength;
}

當(dāng)鼠標(biāo)離開(kāi)ItemsControl時(shí),進(jìn)行效果還原

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;
}

添加背景色,如果未設(shè)置,當(dāng)鼠標(biāo)處于兩個(gè)項(xiàng)之間的空間會(huì)觸發(fā)OnMouseLeave

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

屬性

依賴屬性Scale是為了在Xaml中動(dòng)態(tài)修改其效果

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>

效果

鼠標(biāo)未進(jìn)入?yún)^(qū)域時(shí)

效果1

效果2

鼠標(biāo)進(jìn)入?yún)^(qū)域,移到某一項(xiàng)上時(shí)

效果1

效果2

以上就是WPF自定義控件實(shí)現(xiàn)ItemsControl魚(yú)眼效果的詳細(xì)內(nèi)容,更多關(guān)于WPF ItemsControl魚(yú)眼效果的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#在RichTextBox中顯示不同顏色文字的方法

    C#在RichTextBox中顯示不同顏色文字的方法

    這篇文章主要介紹了C#在RichTextBox中顯示不同顏色文字的方法,實(shí)例分析了C#中RichTextBox控件控制文字顯示效果的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C#中正則表達(dá)式(Regex)過(guò)濾內(nèi)容的基本使用方法

    C#中正則表達(dá)式(Regex)過(guò)濾內(nèi)容的基本使用方法

    在 Regex 類(lèi)中提供了很多方法來(lái)操作正則表達(dá)式,這篇文章主要給大家介紹了關(guān)于C#中正則表達(dá)式(Regex)過(guò)濾內(nèi)容的基本使用方法,需要的朋友可以參考下
    2022-08-08
  • c# 9.0新特性nint和Pattern matching的使用方法

    c# 9.0新特性nint和Pattern matching的使用方法

    這篇文章主要介紹了c# 9.0新特性nint和Pattern matching的使用方法,文中講解非常細(xì)致,幫助你更好的學(xué)習(xí)c# 9.0,有需求的朋友可以參考下
    2020-06-06
  • C#實(shí)現(xiàn)上位機(jī)的遠(yuǎn)程監(jiān)控與控制的詳細(xì)步驟

    C#實(shí)現(xiàn)上位機(jī)的遠(yuǎn)程監(jiān)控與控制的詳細(xì)步驟

    隨著工業(yè)自動(dòng)化、物聯(lián)網(wǎng)以及智能控制系統(tǒng)的普及,遠(yuǎn)程監(jiān)控與控制逐漸成為了許多系統(tǒng)的核心需求,上位機(jī)作為控制與監(jiān)測(cè)系統(tǒng)的核心,常用于接收處理來(lái)自下位機(jī)的數(shù)據(jù)并進(jìn)行控制操作,C#作為一門(mén)高效且功能強(qiáng)大的編程語(yǔ)言,本文將探討如何使用C#實(shí)現(xiàn)上位機(jī)遠(yuǎn)程監(jiān)控與控制
    2025-01-01
  • c#讀取xml文件到datagridview實(shí)例

    c#讀取xml文件到datagridview實(shí)例

    c#讀取xml文件到datagridview實(shí)例,需要的朋友可以參考一下
    2013-03-03
  • C#?as?和?is?運(yùn)算符區(qū)別和用法示例解析

    C#?as?和?is?運(yùn)算符區(qū)別和用法示例解析

    在C#中,as?和?is?關(guān)鍵字都用于處理類(lèi)型轉(zhuǎn)換的運(yùn)算符,但它們有不同的用途和行為,本文我們將詳細(xì)解釋這兩個(gè)運(yùn)算符的區(qū)別和用法,需要的朋友可以參考下
    2025-01-01
  • C#實(shí)現(xiàn)自動(dòng)修復(fù)磁盤(pán)錯(cuò)誤的方法詳解

    C#實(shí)現(xiàn)自動(dòng)修復(fù)磁盤(pán)錯(cuò)誤的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)自動(dòng)修復(fù)磁盤(pán)錯(cuò)誤的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-10-10
  • C#編寫(xiě)DES加密、解密類(lèi)

    C#編寫(xiě)DES加密、解密類(lèi)

    本文給大家匯總了一下使用C#實(shí)現(xiàn)的DES加密、解密類(lèi)的代碼,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下
    2015-05-05
  • C# 實(shí)現(xiàn)把double 存成兩位精度小數(shù)

    C# 實(shí)現(xiàn)把double 存成兩位精度小數(shù)

    這篇文章主要介紹了C# 實(shí)現(xiàn)把double 存成兩位精度小數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 使用Spire.PDF在C#中創(chuàng)建和繪制PDF表單的方法步驟

    使用Spire.PDF在C#中創(chuàng)建和繪制PDF表單的方法步驟

    在日常開(kāi)發(fā)中,我們經(jīng)常需要處理各種文檔,其中PDF因其跨平臺(tái)、安全性高而成為企業(yè)級(jí)應(yīng)用中不可或缺的一部分,然而,手動(dòng)創(chuàng)建、填寫(xiě)或管理PDF表單無(wú)疑是一項(xiàng)耗時(shí)且易出錯(cuò)的任務(wù),所以本文給大家介紹了如何使用Spire.PDF在C#中創(chuàng)建和繪制 PDF 表單,需要的朋友可以參考下
    2025-08-08

最新評(píng)論

灵璧县| 新源县| 平和县| 乌恰县| 黎平县| 德州市| 贵州省| 高淳县| 乐陵市| 宁远县| 浮山县| 茌平县| 吉安县| 高阳县| 乃东县| 瓮安县| 鹤山市| 玉山县| 五寨县| 南乐县| 张家口市| 休宁县| 铜川市| 南澳县| 萨迦县| 鄄城县| 玛纳斯县| 楚雄市| 兰溪市| 西林县| 合作市| 辽阳市| 当涂县| 民丰县| 长子县| 濉溪县| 大邑县| 康马县| 洛南县| 淮滨县| 巢湖市|