UWP &WP8.1 依賴屬性和用戶控件 依賴屬性簡單使用 uwp添加UserControl


上面說 附加屬性。這章節說依賴屬性。 所謂依賴屬性。白話講就是添加一個公開的屬性。

 

同樣,依賴屬性的用法和附加屬性的用法差不多。

 

依賴屬性是具有一個get,set的屬性,以及反調函數。

 

首先是聲明依賴屬性。 依賴屬性的用法如同附加屬性,值得說明的是依賴屬性是附加屬性的”爸爸“,附加屬性是依賴屬性的派生。

 

聲明必須是使用三個關鍵字:public static readonly (公開的 靜態的 只讀的)

之后是 依賴屬性的 標識:DependencyProperty

合起來就是 :public static readonly DependencecyProperty  XXXProperty 

之后就是用DependencecyProperty的Register的方法,進行注冊。 下面是一個例子

 public static readonly DependencyProperty OpenZoomProperty = DependencyProperty.Register
            (
            //name    要注冊的依賴項對象的名稱
            "IsOpenZoom",
            //propertyType    該屬性的類型,作為類型參考
            typeof(bool),
            //ownerType    正在注冊依賴項屬性的所有者類型,作為類型參考
            typeof(UserControl),
            //defaultMetadata    屬性元數據實例。這可以包含一個 PropertyChangedCallback 實現引用。
//  都一個參數:元數據,第二個數據是反調函數【沒有函數會自動注冊一個】
new PropertyMetadata(false, new PropertyChangedCallback(OnChang))
 );

值得說的,依賴屬性的表示名必須是XXX加上Property。

下面是 DependencyProperty的Register方法的四個參數的介紹:

 

名字 解釋 個人理解
name 要注冊的依賴項對象的名稱。 依賴屬性公開的名字
propertyType 該屬性的類型,作為類型參考 這個依賴屬性的類型
ownerType 正在注冊依賴項屬性的所有者類型,作為類型參考 這個依賴屬性屬於誰
defaultMetadata 屬性元數據實例。這可以包含一個 PropertyChangedCallback 實現引用。 反調函數【是否元數據】

         ***這面說一下依賴屬性和附加屬性再最后一個方法的反調函數是不同,(依賴屬性)一個包含兩個參數,(附加屬性)一個只有一個。

這個寫完聲明,說第四個參數會自動注冊一個函數。【接上面注冊】,所謂反調函數就是你最終對某個內容或者屬性的進行操作

  //這個是ScrollViewer的是否開啟放大效果
private static void OnChang(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (e.NewValue != null)
            {
                SetPhoto setphoto = (SetPhoto)d;
                switch ((bool)e.NewValue)
                {
                    case true:
                        setphoto.scrollViewer.ZoomMode = ZoomMode.Enabled;
                        break;
                    case false:
                        setphoto.scrollViewer.ZoomMode = ZoomMode.Disabled;
                        break;
              }                              
         }

        }

 

下面說set get的方法,依賴屬性必須有get/set或者二者。 就是一個普通的方法

 
public bool IsOpenZoom
        {
//get,獲取值並且轉換其bool
            get { return (bool)GetValue(OpenZoomProperty); }
//或者值 並存儲到上面說的依賴屬性中
            set { SetValue(OpenZoomProperty, value); }
        }

到這里 一個簡單的依賴屬性就結束。

 

下面就是一個簡單是例子,用戶控件添加依賴屬性。

用戶控件的目的: 可以放大縮小圖片。

依賴屬性: 1.是否打開放大效果

               2.添加圖片到控件Image

               3.指示放大倍數

添加一個用戶控件 名為SetPhoto

*********************

xaml頁面代碼:

<UserControl 
    x:Class="水印添加M2.SetPhoto"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:水印添加M2"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400">

    <Grid>
        <ScrollViewer x:Name="scrollViewer"  HorizontalScrollBarVisibility="Auto" >
            <Image x:Name="image"/>
        </ScrollViewer>
        
    </Grid>
</UserControl>

之后就是后台代碼:

namespace Mode
{
    public sealed partial class SetPhoto : UserControl
    {
        public SetPhoto()
        {
            this.InitializeComponent();

        }

        public static readonly DependencyProperty OpenZoomProperty = DependencyProperty.Register
            (
            //name    要注冊的依賴項對象的名稱
            "IsOpenZoom",
            //propertyType    該屬性的類型,作為類型參考
            typeof(bool),
            //ownerType    正在注冊依賴項屬性的所有者類型,作為類型參考
            typeof(UserControl),
            //defaultMetadata    屬性元數據實例。這可以包含一個 PropertyChangedCallback 實現引用。
            new PropertyMetadata(false, new PropertyChangedCallback(OnChang))
            );

        public static readonly DependencyProperty SetImageProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(UserControl), new PropertyMetadata(null, new PropertyChangedCallback(ImageChange)));

        public static readonly DependencyProperty ViewChangeProperty = DependencyProperty.Register("ViewChang", typeof(float), typeof(UserControl), new PropertyMetadata(null, new PropertyChangedCallback(ViewChang)));

        private static void ViewChang(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            SetPhoto s = (SetPhoto)d;
     //第一個參數 最大倍數
     //第二個參數 最小倍數
     //第三個參數 放大倍數
            s.scrollViewer.ChangeView(10, 0, (float)e.NewValue);
        }

        private static void ImageChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            SetPhoto s = (SetPhoto)d;
          // 標准Image的Source的類型 方便
            s.image.Source = (ImageSource)e.NewValue;

        }

        private static void OnChang(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (e.NewValue != null)
            {
                SetPhoto setphoto = (SetPhoto)d;
                switch ((bool)e.NewValue)
                {
                    case true:
                        setphoto.scrollViewer.ZoomMode = ZoomMode.Enabled;
                        break;
                    case false:
                        setphoto.scrollViewer.ZoomMode = ZoomMode.Disabled;
                        break;
              }                              
         }

        }
        /// <summary>
        /// 圖片
        /// </summary>
        public ImageSource ImageSource
        {
            get { return (ImageSource)GetValue(SetImageProperty); }

            set { SetValue(SetImageProperty, value); }
        }
        public bool IsOpenZoom
        {
            get { return (bool)GetValue(OpenZoomProperty); }

            set { SetValue(OpenZoomProperty, value); }
        }

        public float ViewChange

        {

            get { return (float)GetValue(ViewChangeProperty); }
            set { SetValue(ViewChangeProperty, value); }

        }

       
    }
}

之后 這個SetPhoto用戶控件就多了三個屬性,以方便我們使用的。

值得一說,用戶控件的使用方式,只有用戶控件在個你要添加的xaml頁面在再同一個命名空間中 你直接使用local關鍵字就可以了

<local:SetPhoto  Grid.Row="1" x:Name="U" IsOpenZoom="True" />

c#直接添加就是

//實例化
SetPhoto setP=new SetPhoto();

之后添加到 你要添加的面板控件或者其他控件中 就可以了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM