it-swarm-id.com

Apakah mungkin untuk menetapkan kode di belakang kamus sumber daya di WPF untuk penanganan acara?

Apakah mungkin untuk menetapkan kode di belakang kamus sumber daya di WPF. Misalnya dalam kontrol pengguna untuk tombol Anda mendeklarasikannya di XAML. Kode penanganan peristiwa untuk klik tombol dilakukan dalam file kode di belakang kontrol. Jika saya harus membuat templat data dengan tombol bagaimana saya bisa menulis kode pengendali event untuk itu klik tombol dalam kamus sumber daya.

143
Crippeoblade

Saya pikir yang Anda tanyakan adalah Anda menginginkan file di belakang kode untuk ResourceDictionary. Anda benar-benar dapat melakukan ini! Bahkan, Anda melakukannya dengan cara yang sama seperti untuk Window:

Katakanlah Anda memiliki ResourceDictionary yang disebut MyResourceDictionary. Dalam file MyResourceDictionary.xaml Anda, letakkan atribut x: Class di elemen root, seperti:

<ResourceDictionary xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
                    x:Class="MyCompany.MyProject.MyResourceDictionary"
                    x:ClassModifier="public">

Kemudian, buat kode di belakang file bernama MyResourceDictionary.xaml.cs dengan deklarasi berikut:

namespace MyCompany.MyProject
{
    partial class MyResourceDictionary : ResourceDictionary
    { 
       public MyResourceDictionary()
       {
          InitializeComponent();
       }     
       ... // event handlers ahead..
    }
}

Dan kamu sudah selesai. Anda dapat meletakkan apa pun yang Anda inginkan dalam kode di belakang: metode, properti, dan penangan event.

== Pembaruan untuk aplikasi Windows 10 ==

Dan kalau-kalau Anda bermain dengan UWP ada satu hal lagi yang harus diperhatikan:

<Application x:Class="SampleProject.App"
             xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
             xmlns:rd="using:MyCompany.MyProject">
<!-- no need in x:ClassModifier="public" in the header above -->

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>

                <!-- This will NOT work -->
                <!-- <ResourceDictionary Source="/MyResourceDictionary.xaml" />-->

                <!-- Create instance of your custom dictionary instead of the above source reference -->
                <rd:MyResourceDictionary />

            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>
204
ageektrapped

Saya tidak setuju dengan "ageektrapped" ... menggunakan metode kelas parsial bukan praktik yang baik. Apa tujuan memisahkan Kamus dari halaman itu?

Dari kode-belakang, Anda dapat mengakses elemen x: Name dengan menggunakan:

Button myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
   ...
}

Anda dapat melakukan ini dalam metode OnApplyTemplate jika Anda ingin terhubung ke kontrol ketika kontrol kustom Anda dimuat. OnApplyTemplate perlu diganti untuk melakukan ini. Ini adalah praktik umum dan memungkinkan gaya Anda tetap terputus dari kontrol. (Gaya tidak harus bergantung pada kontrol, tetapi kontrol harus bergantung pada memiliki gaya).

9
Phobis

Gishu - sementara ini mungkin tampak sebagai "latihan yang umumnya tidak dianjurkan" Ini adalah salah satu alasan Anda mungkin ingin melakukannya:

Perilaku standar untuk kotak teks ketika mereka mendapatkan fokus adalah agar tanda sisipan ditempatkan pada posisi yang sama ketika kontrol kehilangan fokus. Jika Anda lebih suka di seluruh aplikasi Anda bahwa ketika pengguna tab ke kotak teks apa pun bahwa seluruh isi kotak teks itu disorot maka menambahkan penangan sederhana dalam kamus sumber daya akan melakukan trik.

Alasan lain di mana Anda ingin perilaku interaksi pengguna default berbeda dari perilaku out of the box sepertinya kandidat yang baik untuk kode di belakang dalam kamus sumber daya.

Sepenuhnya setuju bahwa apa pun yang merupakan fungsionalitas aplikasi spesifik tidak boleh ada dalam kode di belakang kamus sumber daya.

5
Pete Maher

XAML adalah untuk membuat grafik objek yang tidak mengandung kode.
Templat data digunakan untuk menunjukkan bagaimana objek pengguna khusus akan ditampilkan di layar ... (mis. Jika itu adalah item listbox) perilaku bukan bagian dari bidang keahlian templat data. Gambar ulang solusinya ...

0
Gishu