国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# wpf利用Clip屬性實現(xiàn)截屏框

這篇具有很好參考價值的文章主要介紹了C# wpf利用Clip屬性實現(xiàn)截屏框。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

wpf截屏系列

第一章 使用GDI+實現(xiàn)截屏
第二章 制作截屏框(本章)
______第一節(jié) 使用DockPanel制作截屏框
______第二節(jié) 利用Clip屬性實現(xiàn)截屏框(本節(jié))
第三章 實現(xiàn)截屏框熱鍵截屏
第四章 實現(xiàn)截屏框?qū)崟r截屏
第五章 使用ffmpeg命令行實現(xiàn)錄屏



前言

第一節(jié)已經(jīng)實現(xiàn)過截屏框,實現(xiàn)方法相對簡單,也僅支持矩形框。最近使用wpf的clip時發(fā)現(xiàn)了一種用法,可以實現(xiàn)穿透效果。那顯然我們基于clip也能實現(xiàn)截屏窗口,而且支持任意形狀。


一、實現(xiàn)步驟

1、Clip穿透

使用GeometryGroup 且FillRule為EvenOdd就可以做出穿透的效果。

<Grid>
    <Grid Width="200" Height="200" Background="SeaGreen" >
        <Grid.Clip>
            <GeometryGroup  FillRule="EvenOdd">
                <!--底下的rect必須保持和容器大小一致-->
                <RectangleGeometry  Rect="0 0 200 200" />
                <!--上層形狀即為穿透區(qū)域-->
                <RectangleGeometry x:Name="foreRect" Rect="0 0 200 200" RadiusX="100" RadiusY="100"/>
            </GeometryGroup>
        </Grid.Clip>
    </Grid>
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text= "Clip區(qū)域會穿透" Foreground="Black"></TextBlock>
</Grid>

C# wpf利用Clip屬性實現(xiàn)截屏框,# wpf,c#,wpf,開發(fā)語言

2、子控件同步Clip區(qū)域

單純Clip無法實現(xiàn)拖動和改變大小,尤其是改變大小直接通過鼠標(biāo)事件結(jié)合clip也不好實現(xiàn)。比較簡單的方法是定義一個子控件,子控件的位置和大小與Clip關(guān)聯(lián),這樣只要實現(xiàn)子控件的拖動和調(diào)整大小功能就能控制Clip區(qū)域了。
通過LayoutUpdated事件就可以實時同步Clip區(qū)域。子控件就相當(dāng)于截屏框。

<Border x:Name="clipBorder" LayoutUpdated="Border_LayoutUpdated">

下列代碼的GetPosition是自定義拓展方法,自己實現(xiàn)獲取控件坐標(biāo)即可。

private void Border_LayoutUpdated(object sender, EventArgs e)
{
    //截屏框與上層clip rect保持一致
    foreRect.Rect = new Rect(clipBorder.GetPosition(), new Size(clipBorder.ActualWidth, clipBorder.ActualHeight));;
}

3、子控件實現(xiàn)拖動

參考《wpf拖動系列》,根據(jù)不同的容器選擇不同實現(xiàn)(直接拷貝網(wǎng)頁代碼),此處使用第六章的功能簡化實現(xiàn)。

<Border x:Name="clipBorder" ac:Move.IsDragMoveable="True" >

4、子控件實現(xiàn)拖動調(diào)整大小

參考《wpf拖動調(diào)整大小系列》,根據(jù)不同的容器選擇不同實現(xiàn)(直接拷貝網(wǎng)頁代碼),此處使用第五章的功能簡化實現(xiàn)。

<Border x:Name="clipBorder" ac:Resize.IsDragResizeable="True" >

5、鼠標(biāo)事件傳遞

由于使用了Clip穿透,穿透區(qū)域的子控件是無法響應(yīng)鼠標(biāo)的,有幸的是穿透區(qū)域不會影響裝飾層,所以我們需要在子控件里定義一個裝飾器用于捕獲鼠標(biāo)消息。我們通過《wpf 附加屬性實現(xiàn)界面上定義裝飾器》簡化裝飾器的定義。

<Border x:Name="clipBorder">
    <!--截屏框的裝飾層,用于捕獲鼠標(biāo)消息-->
    <local:AdornerHelper.AdornerContent>
        <Grid MouseDown="Grid_MouseDown" Background="Transparent"></Grid>
    </local:AdornerHelper.AdornerContent>
</Border>
private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{  
     //事件轉(zhuǎn)移,觸發(fā)拖動
    clipBorder.RaiseEvent(e);
}

二、完整代碼

1、自行整合

通過上述步驟,將《wpf拖動系列》、《wpf拖動調(diào)整大小系列》、《wpf 附加屬性實現(xiàn)界面上定義裝飾器》網(wǎng)頁上的代碼(對應(yīng)容器類型)整合到一起即可實現(xiàn)所有功能。

2、簡化的實現(xiàn)

下列是使用wpf拖動系列第六章和wpf拖動調(diào)整大小系列第五章的實現(xiàn),需要下載。
xaml

<Window x:Class="WpfClip.MainWindow"
        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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfClip"
        xmlns:ac="clr-namespace:AC"
        mc:Ignorable="d"
        WindowStyle="None"
        Background="Transparent"
        ResizeMode="NoResize"
        Topmost="True"
        WindowState="Maximized"
        Title="MainWindow" Height="450" Width="800">
    <WindowChrome.WindowChrome>
        <WindowChrome GlassFrameThickness="-1"   CaptionHeight="0"   />
    </WindowChrome.WindowChrome >
    <Grid x:Name="grid" Background="#80000000" LayoutUpdated="Grid_LayoutUpdated">
        <Grid.Clip>
            <!--利用clip實現(xiàn)穿透-->
            <GeometryGroup  FillRule="EvenOdd">
                <RectangleGeometry x:Name="backRect"/>
                <!--實際的截屏形狀-->
                <RectangleGeometry x:Name="foreRect"  />
            </GeometryGroup>
        </Grid.Clip>
        <!--截屏框-->
        <Border x:Name="clipBorder" Width="200" Height="200" ac:Move.IsDragMoveable="True" ac:Resize.IsDragResizeable="True" LayoutUpdated="Border_LayoutUpdated">
            <ac:Resize.ThumbsTemplate>
                <ControlTemplate>
                    <Border Width="16" Height="16" Background=" Green"  BorderBrush="White" BorderThickness="2" CornerRadius="8"></Border>
                </ControlTemplate>
            </ac:Resize.ThumbsTemplate>
            <ac:Resize.ThumbsPanel>
                <ItemsPanelTemplate>
                    <Grid Margin="-8"></Grid>
                </ItemsPanelTemplate>
            </ac:Resize.ThumbsPanel>
            <!--截屏框的裝飾層,用于捕獲鼠標(biāo)消息-->
            <local:AdornerHelper.AdornerContent>
                <Grid MouseDown="Grid_MouseDown" Background="Transparent"></Grid>
            </local:AdornerHelper.AdornerContent>
        </Border>
    </Grid>
</Window>

cs

using AC;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
namespace WpfClip
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Grid_LayoutUpdated(object sender, EventArgs e)
        {
            //確保底層clip rect與容器大小相同
            backRect.Rect=new Rect(0,0, grid.ActualWidth, grid.ActualHeight);
        }
        private void Border_LayoutUpdated(object sender, EventArgs e)
        {
            //截屏框與上層clip rect保持一致
            foreRect.Rect = new Rect(clipBorder.GetPosition(), new Size(clipBorder.ActualWidth, clipBorder.ActualHeight));
            //圓形效果,去掉則是矩形
            foreRect.RadiusX = clipBorder.Width/2;
            foreRect.RadiusY= clipBorder.Height/2;
        }

        private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
        {  
             //事件轉(zhuǎn)移,觸發(fā)拖動
            clipBorder.RaiseEvent(e);
        }
    }

    internal class AdornerHelper
    {
        public static UIElement GetAdornerContent(DependencyObject obj)
        {
            return (UIElement)obj.GetValue(AdornerContent);
        }
        public static void SetAdornerContent(DependencyObject obj, UIElement value)
        {
            obj.SetValue(AdornerContent, value);
        }
        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty AdornerContent =
            DependencyProperty.RegisterAttached("AdornerContent", typeof(UIElement), typeof(AdornerHelper), new PropertyMetadata(null, (d, e) =>
            {
                var c = d as FrameworkElement;
                if (c == null)
                    return;
                var adronerContent = e.NewValue as UIElement;
                if (!c.IsLoaded)
                {
                    if (adronerContent != null)
                    {
                        RoutedEventHandler l = null;
                        l = (s, E) =>
                        {
                            var content = GetAdornerContent(c);
                            if (content != null)
                            {
                                var layer = AdornerLayer.GetAdornerLayer(c);
                                if (layer == null)
                                    throw new Exception("獲取控件裝飾層失敗,控件可能沒有裝飾層!");
                                layer.Add(new NormalAdorner((UIElement)c, (UIElement)e.NewValue));
                            }
                            c.Loaded -= l;
                        };
                        c.Loaded += l;
                    }
                }
                else
                {
                    var layer = AdornerLayer.GetAdornerLayer(d as Visual);
                    if (layer == null)
                        throw new Exception("獲取控件裝飾層失敗,控件可能沒有裝飾層!");
                    if (e.OldValue != null)
                    {
                        var adorners = layer.GetAdorners(c);
                        foreach (var i in adorners)
                        {
                            if (i is NormalAdorner)
                            {
                                var na = i as NormalAdorner;
                                if (na.Child == e.OldValue)
                                {
                                    layer.Remove(i);
                                    break;
                                }
                            }
                        }
                    }
                    if (adronerContent != null)
                    {
                        layer.Add(new NormalAdorner((UIElement)c, (UIElement)e.NewValue));
                    }
                }
            }));

        class NormalAdorner : Adorner
        {
            UIElement _child;
            /// <summary>
            /// 構(gòu)造方法
            /// </summary>
            /// <param name="adornedElement">被添加裝飾器的元素</param>
            /// <param name="child">放到裝飾器中的元素</param>
            public NormalAdorner(UIElement adornedElement, UIElement child) : base(adornedElement)
            {
                _child = child;
                AddVisualChild(child);
            }
            public UIElement Child { get { return _child; } }
            protected override Visual GetVisualChild(int index)
            {
                return _child;
            }
            protected override int VisualChildrenCount
            {
                get
                {
                    return 1;
                }
            }
            protected override Size ArrangeOverride(Size finalSize)
            {
                _child.Arrange(new Rect(new Point(0, 0), finalSize));
                return finalSize;
            }

        }
    }
}

三、效果預(yù)覽

我們可以通過設(shè)置foreRect的類型改變形狀,當(dāng)然Border_LayoutUpdated的邏輯也要相應(yīng)的修改。

1、矩形框

C# wpf利用Clip屬性實現(xiàn)截屏框,# wpf,c#,wpf,開發(fā)語言

2、圓形框

C# wpf利用Clip屬性實現(xiàn)截屏框,# wpf,c#,wpf,開發(fā)語言


總結(jié)

以上就是今天要講的內(nèi)容,有了之前的基礎(chǔ)本文實現(xiàn)起來相對容易,當(dāng)前目前的也是比較初步的功能,但靈活性是比DockPanel要好的,尤其是支持任意形狀,這樣就有利于后期劃線截屏的實現(xiàn)了。文章來源地址http://www.zghlxwxcb.cn/news/detail-817617.html

到了這里,關(guān)于C# wpf利用Clip屬性實現(xiàn)截屏框的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Java】后端開發(fā)語言Java和C#,兩者對比注解和屬性的區(qū)別以及作用

    【Java】后端開發(fā)語言Java和C#,兩者對比注解和屬性的區(qū)別以及作用

    歡迎來到《小5講堂》 大家好,我是全棧小5。 這是《Java》序列文章,每篇文章將以博主理解的角度展開講解, 特別是針對知識點的概念進行敘說,大部分文章將會對這些概念進行實際例子驗證,以此達(dá)到加深對知識點的理解和掌握。 溫馨提示:博主能力有限,理解水平有限

    2024年01月16日
    瀏覽(28)
  • C#創(chuàng)建DataTable并填充數(shù)據(jù),按鈕事件實現(xiàn)全選,并到全選的值。wpf開發(fā)

    wpf開發(fā)中,用事件創(chuàng)建一個datatable度填充到datagird里面,在datagrid里面有第一列是復(fù)選框。用一單擊事件實現(xiàn)全選,用一個按鈕事件得到所選中的值。 Window x:Class=\\\"WpfApp4.MainWindow\\\" ? ? ? ? xmlns=\\\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\\\" ? ? ? ? xmlns:x=\\\"http://schemas.microsoft.com

    2024年02月08日
    瀏覽(27)
  • css 屬性 clip-path:polygon實現(xiàn)任意圖形、多邊形

    css 屬性 clip-path:polygon實現(xiàn)任意圖形、多邊形

    最近畫看板,要求點擊客戶自定義的不規(guī)則圖形內(nèi)的任意地方都可以展示相應(yīng)的提示, 剛開始讓UI 提供切好的不規(guī)則背景圖,切換位置替換不同的圖形,判斷是哪個圖展示對應(yīng)的提示 后來查到css這個屬性,太好用了 clip-path CSS 屬性使用裁剪方式創(chuàng)建元素的可顯示區(qū)域,類似

    2024年02月12日
    瀏覽(94)
  • [C#]Onnxruntime部署Chinese CLIP實現(xiàn)以文搜圖以文找圖功能

    [C#]Onnxruntime部署Chinese CLIP實現(xiàn)以文搜圖以文找圖功能

    【官方框架地址】 https://github.com/OFA-Sys/Chinese-CLIP 【算法介紹】 在當(dāng)今的大數(shù)據(jù)時代,文本信息處理已經(jīng)成為了計算機科學(xué)領(lǐng)域的核心議題之一。為了高效地處理海量的文本數(shù)據(jù),自然語言處理(NLP)技術(shù)應(yīng)運而生。而在諸多NLP技術(shù)中,文本分割是一種基礎(chǔ)且重要的任務(wù)。

    2024年02月02日
    瀏覽(12)
  • Winform/WPF利用CefSharp集成vue開發(fā)

    有時候因為各種原因,可能在開發(fā)winform或wpf項目的時候需要嵌入web項目,而目前vue在web開發(fā)中還是非常流行的,今天有空琢磨了一下怎么在winform中集成vue進行開發(fā),當(dāng)然,winform能實現(xiàn),wpf也是一樣的。 目前希望達(dá)到的效果是,能夠在winform中顯示web界面,并且能夠與vue中的

    2024年02月08日
    瀏覽(21)
  • C# WPF上位機開發(fā)(鍵盤繪圖控制)

    C# WPF上位機開發(fā)(鍵盤繪圖控制)

    【 聲明:版權(quán)所有,歡迎轉(zhuǎn)載,請勿用于商業(yè)用途。 聯(lián)系信箱:feixiaoxing @163.com】 ? ? ? ? 在軟件開發(fā)中,如果存在canvas圖像的話,一般有幾種控制方法。一種是鼠標(biāo)控制;一種是鍵盤控制;還有一種是定時器控制。定時器控制,多常見動畫、游戲、3d視頻當(dāng)中。而鼠標(biāo)控制

    2024年02月02日
    瀏覽(22)
  • C#開發(fā)winform&wpf后臺捕獲鼠標(biāo)移動事件

    做 WPF和winform的時候,可以在界面上設(shè)置鼠標(biāo)移動事件來檢測鼠標(biāo)移動,如果項目為后期改造這樣做的話改動量很大,今天通過另外一種后臺調(diào)用windows api的方式進行快速捕獲和觸發(fā),提高開發(fā)效率分享給大家。

    2024年02月16日
    瀏覽(30)
  • C# WPF上位機開發(fā)(Web API聯(lián)調(diào))

    【 聲明:版權(quán)所有,歡迎轉(zhuǎn)載,請勿用于商業(yè)用途。 聯(lián)系信箱:feixiaoxing @163.com】 ? ? ? ? 很多時候,客戶需要開發(fā)的不僅僅是一個上位機系統(tǒng),它還有其他很多配套的系統(tǒng)或設(shè)備,比如物流小車、立庫、數(shù)字孿生等一整套系統(tǒng)。這個時候,上位機系統(tǒng)就需要和各個子系統(tǒng)

    2024年01月20日
    瀏覽(24)
  • WPF-利用裝飾器實現(xiàn)控件的自由拖動

    WPF-利用裝飾器實現(xiàn)控件的自由拖動

    在項目中經(jīng)常會遇到類似如下要求的需求,創(chuàng)建允許自由拖動的控件,這樣的需求可以使用WPF的裝飾器Adorner來實現(xiàn)。 ? 裝飾器是一種特殊類型的FrameworkElement,裝飾器始終呈現(xiàn)在被裝飾元素的頂部,用于向用戶提供可視化提示。裝飾器可以在不改變原有控件結(jié)構(gòu)的基礎(chǔ)上,將

    2024年02月11日
    瀏覽(31)
  • WPF-利用裝飾器實現(xiàn)空間的自由拖動

    WPF-利用裝飾器實現(xiàn)空間的自由拖動

    在項目中經(jīng)常會遇到類似如下要求的需求,創(chuàng)建允許自由拖動的控件,這樣的需求可以使用WPF的裝飾器Adorner來實現(xiàn)。 ? 裝飾器是一種特殊類型的FrameworkElement,裝飾器始終呈現(xiàn)在被裝飾元素的頂部,用于向用戶提供可視化提示。裝飾器可以在不改變原有控件結(jié)構(gòu)的基礎(chǔ)上,將

    2024年02月11日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包