1. 程式人生 > >WPF 為資源字典 新增事件響應的後臺類

WPF 為資源字典 新增事件響應的後臺類

前言,有許多同學在寫WPF程式時在資源字典里加入了其它控制元件,但又想寫事件來控制這個控制元件,但是資源字典沒有CS檔案,不像窗體XAML還有一個後臺的CS檔案,怎麼辦呢?

在工作時也遇到了這個問題,現在把它分享出來

比如說我們現在要寫一個TabControl控制元件,在TabItem中有一個關閉按鈕或其它按鈕,這個按鈕要能響應某個事件。


現在開始寫資源字典裡的 TabItem的樣式,程式碼如下

  <Style x:Key="TIStyle" TargetType="{x:Type TabItem}">
        <Setter  Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TabItem}">
                    <Border x:Name="layout" BorderBrush="Gray" BorderThickness="1,1,1,0" Background="{TemplateBinding Background}"
                                CornerRadius="3" Margin="2,0,2,0">
                        <Grid Height="20">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition Width="25"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock  TextAlignment="Center" Text="{TemplateBinding Header}" Grid.Column="0" Margin="4,0,3,0"
                            VerticalAlignment="Center"    HorizontalAlignment="Center"/>
                            <Button Content="X" Grid.Column="1"  Height="8" Width="8" Margin="4,1,3,2" 
                            Tag="{TemplateBinding Header}" Click="Button_Click"
                            Background="{x:Null}" BorderBrush="{x:Null}" VerticalAlignment="Center">
                                <Button.Template>
                                    <ControlTemplate >
                                        <Grid>
                                            <Rectangle>
                                                <Rectangle.Fill>
                                                    <VisualBrush>
                                                        <VisualBrush.Visual>
                                                            <Path x:Name="btnPath" 
                                                        Data="M0 0L10 10M0 10L10 0" Stroke="Gray"
                                                        StrokeThickness="1"/>
                                                        </VisualBrush.Visual>
                                                    </VisualBrush>
                                                </Rectangle.Fill>
                                            </Rectangle>
                                        </Grid>
                                        <ControlTemplate.Triggers>
                                            <Trigger Property="IsMouseOver" Value="True">
                                                <Setter TargetName="btnPath" Property="Stroke" Value="Red"/>
                                            </Trigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </Button.Template>
                            </Button>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="White"/>
                            <Setter TargetName="layout" Property="Margin" Value="2,0,2,-1.5"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="false">
                            <Setter Property="Background" Value="LightBlue"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

然後為資源字典建一個後臺類DicEvent.cs
  public  partial class DicEvent : ResourceDictionary
    {
       public void Button_Click(object sender, RoutedEventArgs e)
       {
           //省去處理,如果顯示,表明呼叫成功。
           MessageBox.Show("你成功了!");
       }
    }

在資源字典裡,新增對後臺類的引用


主窗口裡呼叫:

<Window x:Class="WpfDicButton.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TabControl>
            <TabItem Header="第一" Height=" 30" Style="{DynamicResource ResourceKey=TIStyle}"></TabItem>
            
        </TabControl>
    </Grid>
</Window>

記住APP檔案里加入資源字典
  <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="TabControlDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

測試,小功告成


奉上DEMO  下載地址

相關推薦

WPF 資源字典 新增事件響應後臺

前言,有許多同學在寫WPF程式時在資源字典里加入了其它控制元件,但又想寫事件來控制這個控制元件,但是資源字典沒有CS檔案,不像窗體XAML還有一個後臺的CS檔案,怎麼辦呢? 在工作時也遇到了這個問題,現在把它分享出來 比如說我們現在要寫一個TabControl控制元件,在

(6)QAction新增事件響應

以上一篇部落格為基礎,在標頭檔案中新增: //新增開啟操作的槽函式 private slots: void open(); 原始檔建構函式中新增: //設定訊號槽的聯接 connect

WPF-- 合併資源字典

原文: WPF-- 合併資源字典 1.        合併多個外部資源字典成為本地字典   語言 XAML 示例程式碼

初學MFC——VS2013下對話方塊新增訊息響應函式

以響應滑鼠點選“確定控制元件”為例 將滑鼠點選“確定”, 然後找到屬性那一欄,我的介面是右下角有,然後找到閃電的標識點選,就有一堆訊息供你新增,然後找到 BN_CLICKED OnOk, 點一下,有add...,點選這個add就可以了.  

VC6的CHtmlView繼承新增NavigateError事件響應

在VC7中CHtmlView類本身就有OnNavigateError事件響應可是VC6中卻沒有, 經過一番試驗, 找到以下方法為VC6增加此響應 比如CHtmlCtrl 在標頭檔案中增加以下內容  DECLARE_EVENTSINK_MAP() public: virtual

ListView每個Item上面的按鈕新增事件在Adapter中響應

//注意原本getView方法中的int position變數是非final的,現在改為final @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolde

Frame 新增 OnShow 事件響應函式.

更具體的說明可以參看以下兩處: 這裡只把我實現的過程說明一下: 1. 在要新增 OnShow 事件的 Frame 類中, 其 Private 域新增以下函式宣告 // 手動編寫的 OnShow 事件響應函式 procedure CMShowingChanged(var M: TMessage);

VS2015建立庫專案後新增不了WPF資源字典,視窗,使用者控制元件處理辦法

開啟專案工程檔案在PropertyGroup標籤最後加上下面3行: <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&l

[WPF]舊版本的應用新增觸控支援

之前做WPF開發時曾經遇到這樣一個需求:為一個基於 .NET Framework 3.5開發的老舊WPF程式新增觸控支援,以便於大屏觸控展示。 接手之後發現這是一個大坑。 專案最初的時候完全沒考慮過軟體架構設計,業務邏輯基本都寫在後臺程式碼中,經過兩代程式設計師的開發維護(初代開發者已離職,文件這種東西不

後臺程式碼引用資源字典樣式

1.資源字典定義: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

C#控制元件動態新增事件繫結的時機

今天遇到個小問題,要為幾十個文字框新增相同的失去焦點事件,常規的辦法是在VS的事件管理器裡面新增,但那樣太繁瑣了,幾十個文字框,要加幾十遍,這行不通。 於是想到動態繫結,第一次嘗試如下: foreach(TextBox tbx in tbxs){ tbx.Lea

RecyclerView每個item新增點選事件

最終目的模擬ListView的setOnItemClickListener()方法,呼叫者只須呼叫類似於setOnItemClickListener的東西就能獲得被點選item的相關資料。原理為RecyclerView的每個子item設定setOnClickListene

QT 按鈕新增事件

-.在vs2010環境中。 在QT designer中為helloword.ui新增pushbutton  ,返回vs (1):第一種方式: 在helloword.h中新增: public slots:     void ClickButton(); 在helloword.cpp中: 建構函式中新增: c

jsli列表新增點選事件

今天看到一個面試題目 //html程式碼 <body> <ul> <li>1</li> <li>

Qt 新增選單及選單的事件響應(完整的示例)

Qt新增選單有兩種方法,一是用程式碼直接手動新增,二是在Qtdesigner中在介面上直接新增。 先介紹用程式碼如何新增。 需要用到兩個類QMenu和QAction,例如我的Demo程式介面如下: 對於“新建”,“編輯”這些主選單項用QMenu, 而"檔案"下面的子選單,“新建”,“開啟”

MFC 錯誤異常,用vs新增資源資源定義後報錯:error C2065 : 未宣告的識別符號

我添加了一個Dialog資源,修改了ID之後右擊資源添加了一個類,在類裡面有一個成員變數: // 對話方塊資料     enum { IDD = IDD_GETIN }; 而在編譯過程中出現報錯,錯誤代號是error C2065 : 未宣告的識別符號,我的第一反應是為什麼

VBA:動態生成的控制元件新增事件

2.controls.add的時候順便把上一步的變數指向它     Set mycmd = Controls.Add("Forms.CommandButton.1", "CommandButton3", Visible) (adsbygoogle = window.adsbygoo

Java應用程式新增退出事件響應 (關閉虛擬機器而不是程式-system.exit)

/*****************************************************************************本程式僅演示,如何在Java應用程式中新增系統退出事件處理機制**********************************************

(WPF)資源字典

資源字典:資源字典出現的初衷就在於可以實現多個專案之間的共享資源,資源字典只是一個簡單的XAML文件,                   該文件除了儲存希望使用的資源之外,不做任何其它的事情。 資

ListView每個Item上面的按鈕新增事件

1.先看下效果圖:        在這裡僅供測試,我把資料都寫死了,根據需要可以自己進行修改,此外實現ListView上面每個Item上的Button的事件有兩種方法: 1.使用final變數擴充套件區域性變數的生命週期範圍主要程式碼(本文最後附全部程式碼): //注意原本getView方法中的int