1. 程式人生 > >WPF 自定義控制元件的依賴屬性的繫結方法

WPF 自定義控制元件的依賴屬性的繫結方法

首先一些人覺得WPF中前臺的程式碼應該在前臺建立,儘量不要在後臺用程式碼建立。另外如果前臺重複程式碼過多,編寫起來非常繁瑣而且修改更是頭痛。因此使用使用者控制元件的方法把經常使用的前臺模組製作成控制元件,當然用法和普通控制元件基本相同。

注意的地方已經用紅色標記,程式碼如下:

控制元件後臺程式碼:

public partial class UC_ReagentWellTextBlock : UserControl
    {
        public UC_ReagentWellTextBlock()
        {
            //介面初始化
            InitializeComponent();

            //我這裡需要繫結兩個TextBlock,因此將這兩個TextBlock進行繫結,繫結的是用於中轉的變數,後續看的到.
            Binding bindInformation = new Binding("InformationText") { Source = this };
            this.TextBlockInformatioin.SetBinding(TextBlock.TextProperty, bindInformation);

            Binding bindPosition = new Binding("PositionText") { Source = this };
            this.TextBlockPosition.SetBinding(TextBlock.TextProperty, bindPosition);
        }

        //宣告依賴屬性.
        public static readonly DependencyProperty PositionTextProperty = DependencyProperty.Register("PositionText", typeof(string), typeof(UC_ReagentWellTextBlock));
        public static readonly DependencyProperty InformationTextProperty = DependencyProperty.Register("InformationText", typeof(string), typeof(UC_ReagentWellTextBlock));

        //宣告中轉的變數
        public string PositionText
        {
            get { return (string)GetValue(PositionTextProperty); }
            set { SetValue(PositionTextProperty, value); }
        }

        public string InformationText
        {
            get { return (string)GetValue(InformationTextProperty); }
            set { SetValue(InformationTextProperty, value); }
        }
    }

控制元件前臺程式碼:

  <Grid>
        <Border BorderThickness="1" BorderBrush="Black">
            <Grid>
        <Button Style="{DynamicResource s_ShowButton}" />
        <TextBlock x:Name="TextBlockPosition"
                   Style="{DynamicResource s_Position}"/>
        <TextBlock x:Name="TextBlockInformatioin"
                   Style="{DynamicResource s_Info}"/>
            </Grid>
        </Border>
    </Grid>

窗體呼叫控制元件後臺:

           Binding bind2 = new Binding(bindStr);
           //資料繫結,等號後面的東西可以不用看,替換成其他的物件即可.
           well3_1.DataContext = IC_LABRARY.Instrument.Instrument.InstrumentRackSample.InstrumentWellSampleArray[2].InstrumentContainerTube.InformationManagementPatient;
           //繫結資料來源,這裡就是一開始想要實現的和基本控制元件一樣的功能.
           well3_1.SetBinding(UC.UC_ReagentWellTextBlock.PositionTextProperty, bind2);
           well3_1.SetBinding(UC.UC_ReagentWellTextBlock.InformationTextProperty, bind2);

窗體呼叫控制元件前臺:

<Window x:Class="IC_DEMO_UI.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:myReactionWell="clr-namespace:IC_DEMO_UI.UC"
        Title="MainWindow" Height="588.824" Width="300">
    <Window.Resources>
        <Style x:Key="S_TextBlock_No" TargetType="TextBlock">
            <Setter Property="Foreground"  Value="Blue"/>
            <Setter Property="FontFamily" Value="微軟雅黑"/>
            <Setter Property="FontSize" Value="13"/>
            <Setter Property="Margin" Value="0,5,0,0"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
        </Style>
        <Style x:Key="S_TextBlock_Content" TargetType="TextBlock">
            <Setter Property="Foreground"  Value="Blue"/>
            <Setter Property="FontFamily" Value="微軟雅黑"/>
            <Setter Property="FontSize" Value="13"/>
            <Setter Property="Margin" Value="0,25,0,0"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
        </Style>
        <Style x:Name="S_Boarder" x:Key="S_Border" TargetType="Border">
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="BorderBrush" Value="Black"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
        </Style>
            <Style x:Key="S_ButtonWell" TargetType="{x:Type Button}">
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="Margin" Value="2"/>
            <Setter Property="Width" Value="45"/>
            <Setter Property="Height" Value="45"/>

            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid>
                            <Ellipse Stroke="Black">
                                <Ellipse.Fill>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="White" Offset="0"/>
                                        <GradientStop Color="#FF048A00" Offset="1"/>
                                    </LinearGradientBrush>
                                </Ellipse.Fill>
                            </Ellipse>
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                              RecognizesAccessKey="True"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsFocused" Value="True"/>
                            <Trigger Property="IsDefaulted" Value="True"/>
                            <Trigger Property="IsMouseOver" Value="True"/>
                            <Trigger Property="IsPressed" Value="True"/>
                            <Trigger Property="IsEnabled" Value="False"/>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid x:Name="G_MainGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
   <myReactionWell:UC_ReagentWellTextBlock x:Name="well3_1" Grid.Row="0" Grid.Column="2" RenderTransformOrigin="0.424,1.627"/>
   </Grid>
</Window>



溫馨提示:CSDN的Blog第一天不允許髮帶連結的文章,否則將封號哦!

相關推薦

WPF 定義控制元件依賴屬性怎麼實時變化?

WPF 自定義的依賴屬性要想在介面上能立即看到屬性變化的值。必須實現回撥通知 下面以最近剛自定義的RadioButton為例 public class RadioButton360 : RadioButton { public static r

WPF 定義控制元件依賴屬性方法

首先一些人覺得WPF中前臺的程式碼應該在前臺建立,儘量不要在後臺用程式碼建立。另外如果前臺重複程式碼過多,編寫起來非常繁瑣而且修改更是頭痛。因此使用使用者控制元件的方法把經常使用的前臺模組製作成控制元件,當然用法和普通控制元件基本相同。 注意的地方已經用紅色標記,程式碼如下

wpf定義控制元件依賴屬性

  在wpf開發過程中,總會用到格式各樣的控制元件,但是原生控制元件遠遠不能滿足實際開發的需要,這時候wpf強大之處就能體現出來了。根據實際需求自定義各種不同的控制元件滿足不同的業務需求。 首先說需求吧: 一:根據某個bool值,控制一個圓形控制元件顯示或者不顯示某種顏色。 分析: 一:需

WPF定義控制元件(一)の控制元件分類

原文: WPF自定義控制元件(一)の控制元件分類 一、什麼是控制元件(Controls)         控制元件是指對資料和方法的封裝。控制元件可以有自己的屬性和方法,其中屬性是控制元件資料的簡單訪問者,方法則是控制元件的一些簡單而可見的功能、控制元件建

WPF 定義控制元件的坑(蠢的:定義控制元件內容不顯示)

原文: WPF 自定義控制元件的坑(蠢的:自定義控制元件內容不顯示) 自定義控制元件不顯示內容 由於工作需要在寫WPF,其中想要實現一些自己的控制元件所以直接自定義了控制元件博主是繼承了ContenControl的控制元件開始寫的但是發現不管設定Content屬性為任何都是不顯示

WPF定義控制元件(四)の定義控制元件

原文: WPF自定義控制元件(四)の自定義控制元件 在實際工作中,WPF提供的控制元件並不能完全滿足不同的設計需求。這時,需要我們設計自定義控制元件。 這裡LZ總結一些自己的思路,特性如下: Coupling UITemplate Behaviour Function Package

WPF定義控制元件(五)の使用者控制元件(完結)

原文: WPF自定義控制元件(五)の使用者控制元件(完結) 使用者控制元件,WPF中是繼承自UserControl的控制元件,我們可以在裡面融合我們的業務邏輯。 示例:(一個厭惡選擇的使用者控制元件) 後端: using iMicClassBase; using iMicClassBase.B

WPF定義控制元件拖拽到介面報錯-未將物件設定到引用的例項

WPF自定義控制元件拖拽到介面報錯-未將物件設定到引用的例項 若給自定義控制元件註冊了許多屬性,那麼在拖拽使用這個控制元件時可能會引起這個錯誤。原因是控制元件初始化時,各個屬性未被顯式賦值。 解決辦法,給控制元件向外暴漏一初始化的方法,類似於這樣 public void XX

【轉】WPF定義控制元件與樣式(3)-TextBox & RichTextBox & PasswordBox樣式、水印、Label標籤、功能擴充套件

一.前言.預覽   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。 本文主要是對文字輸入控制元件進行樣式開發,及相關擴充套件功能開發,主要內容包括: 基本文字框TextBox控制元件樣式及擴充套件功能,實現了樣式、水印、Label標籤、功

【轉】WPF定義控制元件與樣式(5)-Calendar/DatePicker日期控制元件定義樣式及擴充套件

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。 本文主要內容: 日曆控制元件Calendar自定義樣式; 日期控制元件DatePicker自定義樣式,及Label標籤、水印、清除日期功能擴充套件; 二.Calend

【轉】WPF定義控制元件與樣式(9)-樹控制元件TreeView與選單Menu-ContextMenu

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 選單Menu的自定義樣式; 右鍵選單ContextMenu的自定義樣式; 樹控制元件TreeView的自定義樣式,及右鍵選單實現。 二.選單M

【轉】WPF定義控制元件與樣式(8)-ComboBox與定義多選控制元件MultComboBox

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 下拉選擇控制元件ComboBox的自定義樣式及擴充套件; 自定義多選控制元件MultiComboBox; 二.下拉選擇控制元件ComboBox的自

【轉】WPF定義控制元件與樣式(11)-等待/忙/正在載入狀態-控制元件實現

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要有三種實現方式: 簡單忙碌狀態控制元件BusyBox; Win8/win10效果忙碌狀態控制元件ProgressRing; 彈出非同步等待框WaitingB

【轉】WPF定義控制元件與樣式(12)-縮圖ThumbnailImage /gif動畫圖/圖片列表

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等,若有不明白的地方可以參考本系列前面的文章,文末附有部分文章連結。   本文主要針對WPF專案開發中圖片的各種使用問題,經過總結,把一些經驗分享一下。內容包括: WPF常

【轉】WPF定義控制元件與樣式(13)-定義窗體Window & 適應內容大小訊息框MessageBox

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 自定義Window窗體樣式; 基於自定義窗體實現自定義MessageBox訊息提示框; 二.自定義Window窗體樣式   自定義的Window

wpf 定義控制元件中ElementName和DataContext之間的衝突

現在發現一個問題,如果在xaml中某個控制元件的屬性通過ElementName綁定了。 大概程式碼如下: /// <summary> /// 輸入點名字 /// </summary> public string Titl

WPF定義控制元件中使用了RadioButton後,多次使用該控制元件出現的死迴圈解決方法

最近在專案中需要用到RadioButton,所以在自定義控制元件中使用了一組RadioButton,使用一個預設的groupname,也就是這個goupname給後來的問題埋下了地雷。 定義大致如下: <Grid> <Label Height ="50" W

WPF定義控制元件之列表滑動特效 PowerListBox

原文: WPF自定義控制元件之列表滑動特效 PowerListBox 列表控制元件是應用程式中常見的控制元件之一,對其做一些絢麗的視覺特效,可以讓軟體增色不少。 本人網上看過一個視訊,是windows phone 7系統上的一個App的列表滾動效果,效果非常炫 現在在WPF上用ListBox重現此效

WPF定義控制元件之圖形解鎖控制元件 ScreenUnLock

原文: WPF自定義控制元件之圖形解鎖控制元件 ScreenUnLock ScreenUnLock 與智慧手機上的圖案解鎖功能一樣。通過繪製圖形達到解鎖或記憶圖形的目的。 本人突發奇想,把手機上的圖形解鎖功能移植到WPF中。也應用到了公司的專案中。 在建立ScreenUnLock之前,先來分析一下圖形解

WPF--定義控制元件的動態新增以及BackgroundWorker的使用

昨天在網上看見一位博主寫了BackgroundWorker,感覺非常不錯。學習加修改之後,隨手記錄,防止忘記! 在視窗內同一位置,增添旋轉效果圖,程式碼如下: <Canvas Grid.Row="2" Grid.Column="1" Name="c