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

在WPF中自定義Image控件實現(xiàn)圖像縮放與平移

 更新時間:2026年06月02日 08:41:42   作者:加號3  
本文詳細(xì)講解了在WPF中實現(xiàn)圖像縮放和平移的核心技術(shù)和最佳實踐,涵蓋架構(gòu)設(shè)計、變換矩陣管理、邊界控制策略、慣性滾動等及性能優(yōu)化等多個方面,幫助開發(fā)者者構(gòu)建專業(yè)級體驗的自定義圖像控件,需要的朋友可以參考下

在 WPF 應(yīng)用開發(fā)中,圖像的交互式瀏覽是一項高頻需求。無論是醫(yī)學(xué)影像查看、工業(yè)檢測界面,還是普通圖片瀏覽器,縮放和平移都是最基礎(chǔ)也最核心的交互能力。本文將從架構(gòu)設(shè)計、坐標(biāo)變換、交互邏輯三個維度,系統(tǒng)講解如何在 WPF 中構(gòu)建一個具備專業(yè)級體驗的自定義圖像控件。

一、為什么需要自定義控件

WPF 內(nèi)置的 Image 控件功能單一,僅負(fù)責(zé)將圖像渲染到界面。雖然可以通過 ScaleTransform 和 TranslateTransform 實現(xiàn)基礎(chǔ)的縮放平移,但在實際項目中往往面臨以下挑戰(zhàn):

  • 變換原點(diǎn)不一致:縮放時以鼠標(biāo)位置為中心還是以控件中心為中心,直接決定用戶體驗
  • 邊界約束缺失:圖像縮放過小或平移出可視區(qū)域后,界面呈現(xiàn)失控狀態(tài)
  • 交互沖突:縮放與平移的手勢識別、與外部滾動條的協(xié)調(diào)、與選中框等疊加元素的配合
  • 性能瓶頸:大圖像頻繁變換時的渲染卡頓,以及縮略圖與全圖的切換策略

自定義控件的價值在于將這些問題封裝到控件內(nèi)部,對外暴露簡潔的依賴屬性(如 ZoomLevel、PanOffset),讓業(yè)務(wù)層只需關(guān)注"顯示什么",而非"如何顯示"。

二、核心架構(gòu)設(shè)計

1. 視覺樹結(jié)構(gòu)

一個健壯的圖像瀏覽控件,視覺樹通常包含三層:

  • 底層:圖像層
    承載原始圖像內(nèi)容。使用 ImageBrush 填充一個 Rectangle 或直接使用 Image 元素,配合 RenderTransform 應(yīng)用變換矩陣。選擇 RenderTransform 而非 LayoutTransform 的關(guān)鍵原因在于性能——前者在布局完成后執(zhí)行,不會觸發(fā)重新測量和排列。
  • 中層:交互層
    覆蓋在圖像之上的透明面板(如 Canvas 或自定義的 Adorner),負(fù)責(zé)捕獲鼠標(biāo)和觸摸事件。將交互層與圖像層分離,可以避免變換矩陣對事件坐標(biāo)的干擾,也便于后續(xù)疊加標(biāo)注、測量線等附加元素。
  • 頂層:裝飾層
    用于顯示當(dāng)前縮放比例、導(dǎo)航縮略圖、操作提示等輔助信息。通常通過 AdornerLayer 實現(xiàn),保持與主內(nèi)容的解耦。

2. 變換矩陣的統(tǒng)一管理

WPF 中的 MatrixTransform 是管理縮放平移的最佳選擇。相比分別維護(hù) ScaleTransform 和 TranslateTransform,單一矩陣的優(yōu)勢在于:

  • 組合變換只需一次矩陣乘法,避免多次變換的累積誤差
  • 坐標(biāo)轉(zhuǎn)換(屏幕坐標(biāo) ↔ 圖像坐標(biāo))可以通過矩陣的逆運(yùn)算精確完成
  • 動畫過渡時,只需對矩陣元素進(jìn)行插值,實現(xiàn)平滑的縮放動畫

控件內(nèi)部維護(hù)一個 Matrix 對象,任何用戶操作(滾輪縮放、拖拽平移)都轉(zhuǎn)化為對該矩陣的更新,再同步到 RenderTransform。

三、縮放邏輯的深度解析

1. 以鼠標(biāo)位置為中心的縮放

這是專業(yè)圖像瀏覽器的標(biāo)準(zhǔn)行為。核心原理是:縮放前后,鼠標(biāo)指針在圖像上的對應(yīng)物理位置保持不變。
實現(xiàn)上需要三個步驟:

  • 獲取鼠標(biāo)當(dāng)前位置相對于圖像容器的坐標(biāo)
  • 計算縮放后的新矩陣,使該坐標(biāo)點(diǎn)在新舊矩陣下的映射結(jié)果相同
  • 應(yīng)用新矩陣并刷新顯示
    數(shù)學(xué)上,這等價于以鼠標(biāo)位置為原點(diǎn)進(jìn)行縮放變換,再補(bǔ)償平移量。這種"錨點(diǎn)縮放"讓用戶能夠精確放大到感興趣的區(qū)域,而不需要縮放后再手動平移調(diào)整。

2. 縮放級別的離散化與連續(xù)化

兩種策略適用于不同場景:

  • 連續(xù)縮放(如 Photoshop)
    滾輪每轉(zhuǎn)動一格,縮放比例按固定步長(如 1.1 倍)連續(xù)變化。體驗流暢,適合精細(xì)調(diào)整,但可能產(chǎn)生非整數(shù)的縮放比例,對像素級查看不夠友好。
  • 離散級別(如地圖應(yīng)用)
    預(yù)定義一組縮放級別(如 25%、50%、100%、200%),滾輪 操作跳到最近的級別。適合需要精確比例的場景,但切換時可能有跳躍感。
    實際實現(xiàn)中,可以結(jié)合兩者:滾輪提供連續(xù)縮放,同時提供快捷鍵直接跳轉(zhuǎn)到 100%(實際像素)或適應(yīng)窗口等離散級別。

3. 縮放范圍的邊界控制

必須限制最小和最大縮放比例,防止用戶操作失控:

  • 最小縮放:通常設(shè)為圖像完全適應(yīng)控件窗口的比例,或略小一些(如 10%)。小于此值時,圖像可能縮成一個小點(diǎn),失去操作意義。
  • 最大縮放:取決于圖像分辨率和應(yīng)用場景。醫(yī)學(xué)影像可能需要放大到 800% 觀察細(xì)節(jié),而普通圖片瀏覽器 400% 已足夠。
    邊界控制應(yīng)在矩陣計算階段完成,而非事后修正。即先計算理論變換矩陣,再將其裁剪到合法范圍內(nèi),最后應(yīng)用。這樣可以避免矩陣"抖動"——用戶快速滾動時,縮放比例在邊界附近來回彈跳。

四、平移邏輯的精細(xì)處理

1. 拖拽平移的坐標(biāo)映射

鼠標(biāo)拖拽時,控件需要區(qū)分"按下了哪個鍵"和"在哪個元素上按下"。通常約定:

  • 左鍵拖拽:平移圖像
  • 右鍵拖拽:框選區(qū)域(如有此功能)
  • 中鍵拖拽:部分軟件用作快速平移(與左鍵功能相同,但適合長時間拖拽)

拖拽平移的本質(zhì)是:鼠標(biāo)移動向量直接映射為圖像的平移向量,再疊加到變換矩陣上。但需要注意,這里的移動向量是屏幕像素距離,而矩陣中的平移量是變換后的邏輯距離。由于縮放比例的存在,兩者是線性關(guān)系,但方向相反——鼠標(biāo)向右移動,圖像應(yīng)向左滾動,以產(chǎn)生"抓住圖像拖動"的物理直覺。

2. 邊界回彈與留白策略

圖像平移出可視區(qū)域是常見誤操作,控件應(yīng)提供智能約束:

  • 硬邊界(Hard Clamp)
    圖像邊緣不允許超出控件邊界。實現(xiàn)簡單,但用戶體驗生硬——當(dāng)圖像放大后,邊緣恰好對齊邊界時,用戶可能誤以為已經(jīng)到達(dá)圖像盡頭。
  • 軟邊界(Soft Bounce)
    允許圖像短暫超出邊界,松手后自動回彈。類似手機(jī)相冊的體驗,操作感更自然,但實現(xiàn)復(fù)雜度增加,需要處理動畫過渡。
  • 留白邊距(Margin)
    即使圖像完全適應(yīng)窗口,也允許少量平移,使圖像不必始終居中。這在配合其他疊加元素(如側(cè)邊屬性面板)時特別有用。

3. 慣性滾動

對于觸摸屏或大圖像瀏覽,加入慣性滾動能顯著提升體驗。鼠標(biāo)/手指松開后,圖像繼續(xù)按原有方向減速滑動,直到停止。實現(xiàn)上需要:

  • 拖拽過程中記錄最近幾幀的速度向量
  • 釋放時根據(jù)末速度啟動動畫
  • 動畫每幀按衰減系數(shù)降低速度,同時檢測邊界碰撞

WPF 的 CompositionTarget.Rendering 或 Storyboard 均可實現(xiàn)慣性動畫,前者幀率更穩(wěn)定,后者與 XAML 集成更好。

五、代碼實現(xiàn)

1. 自定義控件界面布局xaml實現(xiàn)

<UserControl
    x:Class="HalconDemo.ImageUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:HalconDemo"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch"
    d:DesignHeight="1024"
    d:DesignWidth="1920"
    mc:Ignorable="d">
    <Grid>
        <ContentControl
            Name="Part_ImageContainer"
            MaxWidth="1920"
            MaxHeight="1024"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            HorizontalContentAlignment="Stretch"
            VerticalContentAlignment="Stretch"
            ClipToBounds="True"
            Cursor="Hand">
            <Image
                Name="image"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                RenderOptions.BitmapScalingMode="NearestNeighbor">
                <Image.RenderTransform>
                    <TransformGroup x:Name="group">
                        <ScaleTransform x:Name="scaler" />
                        <TranslateTransform x:Name="transer" />
                    </TransformGroup>
                </Image.RenderTransform>
            </Image>
        </ContentControl>
    </Grid>
</UserControl>

2. 自定義控件后端代碼cs實現(xiàn)

/// <summary>
/// ImageUserControl.xaml 的交互邏輯
/// </summary>
public partial class ImageUserControl : UserControl
{
    /// <summary>
    /// 鼠標(biāo)是否按下
    /// </summary>
    private bool mouseDown;


    /// <summary>
    /// 移動圖片前,按下鼠標(biāo)左鍵時,鼠標(biāo)相對于Part_ImageContainer的點(diǎn)
    /// </summary>
    Point moveStart;

    public ImageUserControl()
    {
        InitializeComponent();
    }

    ~ImageUserControl()
    {
        Part_ImageContainer.MouseLeftButtonDown -= ImgMouseLeftButtonDown;
        Part_ImageContainer.MouseMove -= ImgMouseMove;
        Part_ImageContainer.MouseUp -= ImgMouseUp;
    }

    /// <summary>
    /// 初始化加載圖像
    /// </summary>
    /// <param name="filePath">圖像路徑</param>
    /// <param name="IsMove">是否移動,true是,false否</param>
    public void InitImage(string filePath,bool IsMove = true)
    {
        if (IsMove)
        {
            Part_ImageContainer.MouseLeftButtonDown += ImgMouseLeftButtonDown;
            Part_ImageContainer.MouseMove += ImgMouseMove;
            Part_ImageContainer.MouseUp += ImgMouseUp;
        }
        image.Source = new BitmapImage(new Uri(filePath, UriKind.Absolute));
    }

    private void ImgMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        //嘗試將鼠標(biāo)強(qiáng)制捕獲到此元素
        Part_ImageContainer.CaptureMouse();
        mouseDown = true;
        moveStart = e.GetPosition(Part_ImageContainer);
    }

    private void ImgMouseMove(object sender, MouseEventArgs e)
    {
        var mouseEnd = e.GetPosition(Part_ImageContainer);           // 鼠標(biāo)移動時,獲取鼠標(biāo)相對圖片容器的點(diǎn)
        if (mouseDown)
        {
            if (e.LeftButton == MouseButtonState.Pressed)           // 按下鼠標(biāo)左鍵,移動圖片
            {
                DoMove(mouseEnd);
            }
        }
    }

    private void ImgMouseUp(object sender, MouseButtonEventArgs e)
    {
        Part_ImageContainer.ReleaseMouseCapture();
        mouseDown = false;
    }

    private void ImgMouseWheel(object sender, MouseWheelEventArgs e)
    {
        var point = e.GetPosition(image);
        double delta = e.Delta * 0.002;
        DoScale(point, delta);
    }
    /// <summary>
    /// 縮放圖片。最小為0.1倍,最大為30倍
    /// </summary>
    /// <param name="point">相對于圖片的點(diǎn),以此點(diǎn)為中心縮放</param>
    /// <param name="delta">縮放的倍數(shù)增量</param>
    private void DoScale(Point point, double delta)
    {
        // 限制最大、最小縮放倍數(shù)
        if (scaler.ScaleX + delta < 0.1 || scaler.ScaleX + delta > 30) return;

        scaler.ScaleX += delta;
        scaler.ScaleY += delta;

        transer.X -= point.X * delta;
        transer.Y -= point.Y * delta;
    }

    /// <summary>
    /// 移動圖片
    /// </summary>
    /// <param name="moveEndPoint">移動圖片的終點(diǎn)(相對于Part_ImageContainer)</param>
    private void DoMove(Point moveEndPoint)
    {
        // 考慮到旋轉(zhuǎn)的影響,因此將兩個點(diǎn)轉(zhuǎn)換到Part_Image坐標(biāo)系,計算x、y的增量
        Point start = Part_ImageContainer.TranslatePoint(moveStart, image);
        Point end = Part_ImageContainer.TranslatePoint(moveEndPoint, image);


        // 判斷一下,如果scale很大的時候,移動會很遲緩。此時應(yīng)該將移動放大
        if (scaler.ScaleX > 7)
        {
            transer.X += (end.X - start.X) * 4;
            transer.Y += (end.Y - start.Y) * 4;
        }
        else if (scaler.ScaleX > 5)
        {
            transer.X += (end.X - start.X) * 3;
            transer.Y += (end.Y - start.Y) * 3;
        }
        else if (scaler.ScaleX > 3)
        {
            transer.X += (end.X - start.X) * 2;
            transer.Y += (end.Y - start.Y) * 2;
        }
        else if (scaler.ScaleX < 0.5)
        {
            transer.X += (end.X - start.X) * 0.5;
            transer.Y += (end.Y - start.Y) * 0.5;
        }
        else
        {
            transer.X += (end.X - start.X);
            transer.Y += (end.Y - start.Y);
        }
        moveStart = moveEndPoint;

        // 以下代碼,抄的https://blog.csdn.net/weixin_42975610/article/details/113741534

        // W+w > 2*move_x > -((2*scale-1)*w + W)  水平平移限制條件
        // H+h > 2*move_y > -((2*scale-1)*h + H)  垂直平移限制條件

        if (transer.X * 2 > image.ActualWidth + Part_ImageContainer.ActualWidth - 20)
            transer.X = (image.ActualWidth + Part_ImageContainer.ActualWidth - 20) / 2;

        if (-transer.X * 2 > (2 * scaler.ScaleX - 1) * image.ActualWidth + Part_ImageContainer.ActualWidth - 20)
            transer.X = -((scaler.ScaleX - 0.5) * image.ActualWidth + Part_ImageContainer.ActualWidth / 2 - 10);

        if (transer.Y * 2 > image.ActualHeight + Part_ImageContainer.ActualHeight - 20)
            transer.Y = (image.ActualHeight + Part_ImageContainer.ActualHeight - 20) / 2;

        if (-transer.Y * 2 > (2 * scaler.ScaleY - 1) * image.ActualHeight + Part_ImageContainer.ActualHeight - 20)
            transer.Y = -((scaler.ScaleY - 0.5) * image.ActualHeight + Part_ImageContainer.ActualHeight / 2 - 10);
    }

    /// <summary>
    /// 圖像縮放
    /// </summary>
    /// <param name="point">當(dāng)前坐標(biāo)</param>
    /// <param name="scale">縮放倍數(shù)</param>
    public void ImageScale(Point point, double scale)
    {
        DoScale(point, scale);
    }
}

3. 調(diào)用自定義控件

//控件引用
 <Canvas
     x:Name="canvas"
     Grid.Row="1"
     Background="Black">
     <HalconDemo:ImageUserControl
         x:Name="ImageUserControl"
         Grid.Row="1"
         Width="{Binding ElementName=canvas, Path=ActualWidth}"
         Height="{Binding ElementName=canvas, Path=ActualHeight}"
         MouseWheel="ImageUserControl_MouseWheel" />
 </Canvas>
//鼠標(biāo)滾動縮放
 private void ImageUserControl_MouseWheel(object sender, MouseWheelEventArgs e)
 {
     var point = e.GetPosition(image);
     double delta = e.Delta * 0.002;
     ImageUserControl.ImageScale(point, delta);
 }

六、性能優(yōu)化要點(diǎn)

1. 大圖像的分級加載

直接加載一張 100MB 的 TIFF 圖像到 Image 控件,即使只是顯示縮略圖,也會消耗大量內(nèi)存。優(yōu)化策略:

  • 解碼尺寸控制:使用 BitmapImage.DecodePixelWidth 限制解碼后的像素尺寸,只加載當(dāng)前視圖需要的分辨率
  • 虛擬化:對于超大圖像(如衛(wèi)星圖、病理切片),采用金字塔分層結(jié)構(gòu),根據(jù)當(dāng)前縮放級別加載對應(yīng)層級的瓦片
  • 異步加載:圖像解碼在后臺線程完成,避免阻塞 UI

2. 渲染層優(yōu)化

  • 設(shè)置 RenderOptions.BitmapScalingMode 為 NearestNeighbor(放大時保持像素銳利)或 Fant(縮小時平滑)
  • 對靜態(tài)圖像啟用 BitmapCache,將變換后的結(jié)果緩存為位圖,減少每幀重繪
  • 避免在變換過程中頻繁更新其他 UI 元素,減少布局傳遞

七、工程實踐

WPF 自定義 Image 控件的縮放與平移實現(xiàn),核心在于變換矩陣的精確控制與用戶交互的細(xì)膩映射:

  • 架構(gòu)選擇:根據(jù)復(fù)用需求選擇附加行為、自定義控件或裝飾器方案
  • 坐標(biāo)管理:理清 DIP、圖像坐標(biāo)、變換矩陣的層級關(guān)系
  • 交互細(xì)節(jié):以光標(biāo)為中心的縮放、邊界約束、慣性動畫提升體驗
  • 性能平衡:緩存策略、大圖像虛擬化、GPU 加速應(yīng)對復(fù)雜場景
  • 工程化:MVVM 集成、狀態(tài)持久化、無障礙支持完善產(chǎn)品化

八、總結(jié)

WPF 中實現(xiàn)圖像縮放平移,表面上是變換矩陣的應(yīng)用,實質(zhì)上是對坐標(biāo)系、交互模型、渲染性能的系統(tǒng)把控。自定義控件的意義不在于技術(shù)復(fù)雜度,而在于將"圖像如何被觀看"這一交互細(xì)節(jié)封裝起來,讓業(yè)務(wù)代碼保持清晰。

從以鼠標(biāo)為中心的錨點(diǎn)縮放,到邊界約束與慣性滾動的手感調(diào)優(yōu),再到與大圖像、觸控、疊加元素的協(xié)同,每一個環(huán)節(jié)都直接影響最終用戶體驗。在工業(yè)軟件、醫(yī)療影像、地理信息系統(tǒng)等專業(yè)領(lǐng)域,這些細(xì)節(jié)往往決定了產(chǎn)品的可用性邊界。

對于 WPF 開發(fā)者而言,掌握自定義控件的開發(fā)范式,不僅能解決圖像瀏覽這一具體問題,更能建立起對 WPF 渲染管線、輸入系統(tǒng)和依賴屬性的深層理解,為構(gòu)建更復(fù)雜的交互界面打下堅實基礎(chǔ)。

以上就是在WPF中自定義Image控件實現(xiàn)圖像縮放與平移的詳細(xì)內(nèi)容,更多關(guān)于WPF Image圖像縮放與平移的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#串口通訊概念及簡單的實現(xiàn)方法

    C#串口通訊概念及簡單的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于C#串口通訊概念及簡單的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 詳解C#如何利用TcpListener和TcpClient實現(xiàn)Tcp通訊

    詳解C#如何利用TcpListener和TcpClient實現(xiàn)Tcp通訊

    TcpListener 和 TcpClient 是在 System.Net.Sockets.Socket 類的基礎(chǔ)上做的進(jìn)一步封裝,使用 GetStream 方法返回網(wǎng)絡(luò)流,下面我們就來詳細(xì)一下如何使用TcpListener和TcpClient實現(xiàn)Tcp通訊吧
    2023-12-12
  • C#實現(xiàn)跨進(jìn)程條件變量的示例代碼

    C#實現(xiàn)跨進(jìn)程條件變量的示例代碼

    C#提供的多進(jìn)程同步對象有互斥鎖和信號量,但是并沒有條件變量,雖然信號量條件變量一定程度可以等效,但是具體的使用還是會有區(qū)別,本文提供了一種條件變量的實現(xiàn)方法,可以用于進(jìn)程間的同步控制,需要的朋友可以參考下
    2024-07-07
  • C# 多線程學(xué)習(xí)之基礎(chǔ)入門

    C# 多線程學(xué)習(xí)之基礎(chǔ)入門

    線程(英語:thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實際運(yùn)作單位。今天小編就帶大家了解一下C#中的多線程,快來學(xué)習(xí)一下吧
    2021-12-12
  • C#中關(guān)于double.ToString()的用法

    C#中關(guān)于double.ToString()的用法

    這篇文章主要介紹了C#中關(guān)于double.ToString()的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#實現(xiàn)讀取被進(jìn)程占用的文件實現(xiàn)方法

    C#實現(xiàn)讀取被進(jìn)程占用的文件實現(xiàn)方法

    這篇文章主要介紹了C#實現(xiàn)讀取被進(jìn)程占用的文件實現(xiàn)方法,涉及C#進(jìn)程操作及文件讀取的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • C#的FileInfo類實現(xiàn)文件操作實例

    C#的FileInfo類實現(xiàn)文件操作實例

    這篇文章主要介紹了C#的FileInfo類實現(xiàn)文件操作實例,比較實用的功能,需要的朋友可以參考下
    2014-07-07
  • C#調(diào)用SQLite的詳細(xì)代碼舉例

    C#調(diào)用SQLite的詳細(xì)代碼舉例

    SQLite是一個輕量級、跨平臺的關(guān)系型數(shù)據(jù)庫,在小型項目中,方便,易用,同時支持多種開發(fā)語言,這篇文章主要給大家介紹了關(guān)于C#調(diào)用SQLite的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • C#簡易圖片格式轉(zhuǎn)換器實現(xiàn)方法

    C#簡易圖片格式轉(zhuǎn)換器實現(xiàn)方法

    這篇文章主要介紹了C#簡易圖片格式轉(zhuǎn)換器實現(xiàn)方法,涉及C#基于WinForm操作圖片的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • C#基礎(chǔ)語法:as 運(yùn)算符使用實例

    C#基礎(chǔ)語法:as 運(yùn)算符使用實例

    這篇文章主要介紹了C#基礎(chǔ)語法:as 運(yùn)算符使用實例,本文給出了類、字符串、數(shù)字、浮點(diǎn)數(shù)、null等值的運(yùn)算實例,需要的朋友可以參考下
    2015-06-06

最新評論

玉溪市| 英山县| 襄汾县| 萨迦县| 通化市| 荣成市| 太仓市| 威宁| 洪雅县| 吴堡县| 上林县| 楚雄市| 五大连池市| 民和| 高尔夫| 桦川县| 伊吾县| 安岳县| 五常市| 保亭| 新乡县| 南陵县| 南京市| 紫金县| 漳州市| 青海省| 林周县| 廉江市| 阿城市| 兴仁县| 南陵县| 富顺县| 分宜县| 山阴县| 苏尼特右旗| 沐川县| 天峨县| 唐海县| 静海县| 北海市| 休宁县|