Можно ли установить код позади словаря ресурсов в WPF для обработки событий? - PullRequest
140 голосов
/ 18 сентября 2008

Можно ли установить код за словарем ресурсов в WPF. Например, в пользовательском контроле для кнопки вы объявляете ее в XAML. Код обработки события для нажатия кнопки выполняется в файле кода за элементом управления. Если бы мне нужно было создать шаблон данных с кнопкой, как я могу написать код обработчика события для его нажатия кнопки в словаре ресурсов.

Ответы [ 4 ]

201 голосов
/ 19 сентября 2008

Я думаю, что вы спрашиваете, хотите ли вы файл с выделенным кодом для ResourceDictionary. Вы можете полностью сделать это! На самом деле, вы делаете это так же, как для окна:

Скажем, у вас есть ResourceDictionary под названием MyResourceDictionary. В вашем файле 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>
9 голосов
/ 26 сентября 2008

Я не согласен с "ageektrapped" ... использование метода частичного класса не является хорошей практикой. Какова будет тогда цель отделения словаря от страницы?

Из выделенного кода вы можете получить доступ к элементу x: Name, используя:

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

Вы можете сделать this в методе OnApplyTemplate, если хотите подключиться к элементам управления при загрузке пользовательского элемента управления. OnApplyTemplate должен быть переопределен, чтобы сделать это. Это обычная практика и позволяет вашему стилю оставаться оторванным от контроля. (Стиль не должен зависеть от элемента управления, но элемент управления должен зависеть от наличия стиля).

5 голосов
/ 27 ноября 2009

Гишу - хотя это может показаться "обычно не поощряемой практикой". Вот одна из причин, по которой вы можете захотеть это сделать:

Стандартным поведением для текстовых полей, когда они получают фокус, является размещение каретки в том же положении, в котором она находилась, когда элемент управления потерял фокус. Если во всем приложении вы предпочитаете, чтобы при переходе пользователя к любому текстовому полю все содержимое текстового поля было выделено, то добавление простого обработчика в словарь ресурсов помогло бы.

Любая другая причина, по которой вы хотите, чтобы поведение пользователя по умолчанию отличалось от стандартного поведения, кажется хорошим кандидатом на код в словаре ресурсов.

Полностью согласен, что все, что специфично для функциональности приложения, не должно быть в коде позади словаря ресурсов.

0 голосов
/ 18 сентября 2008

XAML предназначен для построения графов объектов, не содержащих код.
Шаблон данных используется для указания того, как пользовательский объект-объект должен отображаться на экране ... (например, если это элемент списка), не является частью области знаний шаблона данных. Перерисовать решение ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...