wpf設計 - 是否有可能在WPF資源字典背後設置代碼以進行事件處理?




wpf教學 (3)

Gishu - 雖然這可能似乎是“一般不被鼓勵的做法”這是你可能想要做的一個原因:

文本框獲得焦點時的標準行為是將插入符號放置在控件失焦時的相同位置。 如果您希望在整個應用程序中,當用戶選中任何文本框時,文本框的整個內容都被高亮顯示,那麼在資源字典中添加一個簡單的處理程序就可以實現。

您希望默認用戶交互行為與開箱即用行為不同的任何其他原因似乎都是資源字典中代碼隱藏的良好選擇。

完全同意,任何特定於應用程序功能的應用程序不應位於資源字典後面的代碼中。

是否有可能在WPF的資源字典背後設置代碼。 例如,在一個用戶控件中,您可以在XAML中聲明它。 按鈕單擊的事件處理代碼在控件後面的代碼文件中完成。 如果我要用按鈕創建數據模板,那麼我怎樣才能在資源字典中為它的按鈕點擊編寫事件處理程序代碼。


XAML用於構造不包含代碼的對像圖。
數據模板用於指示自定義用戶對像如何在屏幕上呈現......(例如,如果它是列錶框項目),行為不是數據模板專業領域的一部分。 重新繪製解決方案...


我認為你所要求的是你想要一個ResourceDictionary的代碼隱藏文件。 你完全可以做到這一點! 實際上,您的操作方式與窗口相同:

假設你有一個名為MyResourceDictionary的ResourceDictionary。 在MyResourceDictionary.xaml文件中,將x:Class屬性放在根元素中,如下所示:

<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">

然後,使用以下聲明在文件後面創建一個名為MyResourceDictionary.xaml.cs的代碼:

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

你完成了。 你可以把任何你想要的東西放在代碼後面:方法,屬性和事件處理程序。

== Windows 10應用程序更新==

如果你正在玩UWP,還有一件事要注意:

<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>




wpf