Добавление .cs в ResourceDictionary? - PullRequest
5 голосов
/ 01 марта 2010

У меня есть DataTemplate в словаре ресурсов, а в некоторых мне нужна кнопка, и я не знаю, как использовать код для управления событиями.

Я попытался добавить класс в свой словарь ресурсов следующим образом:

<ResourceDictionary 
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   x:Class="SLProject.Templates"
   x:Class="TVTemplate">

И я определил класс в файле cs так:

namespace SLProject.Templates
{
    partial class TVTemplate
    { 

    }
}

Сборка в порядке, но при запуске приложения появляется ошибка XAML:

AG_E_PARSER_BAD_TYPE

Я попробовал все, что я знаю, например, изменить вид класса на ClassModifier, сделать класс унаследованным классом RessourceDictionnary ... никак.

У кого-то есть идея ...

Спасибо.

Ответы [ 4 ]

6 голосов
/ 04 июня 2010

Использование атрибута x:Class позволяет вам определять код для ResourceDictionary. Вы должны указать полное пространство имен класса (т.е. x:Class="WpfApplication.MyClass"), и такой класс должен быть определен как partial (по крайней мере VS 2010 жалуется и не компилируется без такого модификатора).

Я смоделировал простой пример:

1. Создание нового проекта приложения WPF ( WpfApplication )

2. Добавьте новый файл класса ( TestClass.cs ) и вставьте следующий код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;
using System.Windows;

namespace WpfApplication
{
    public partial class TestClass
    {
        private void OnDoubleClick(object obj, MouseButtonEventArgs args)
        {
            MessageBox.Show("Double clicked!");
        }
    }
}

3. Добавьте новый ResourceDictionary ( Resources.xaml ), откройте файл и вставьте следующий код

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    x:Class="WpfApplication.TestClass">
    <Style TargetType="{x:Type Label}">
        <EventSetter Event="Label.MouseDoubleClick" Handler="OnDoubleClick"/>
    </Style>
</ResourceDictionary>

4. Наконец, откройте MainWindow.xaml и вставьте следующий код

<Window x:Class="WpfApplication.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">
    <Window.Resources>
        <ResourceDictionary Source="Resources.xaml"/>
    </Window.Resources>
    <Grid>
        <Label Content="Double click here..." HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Background="Red"/>
    </Grid>
</Window>

В примере я подключаю событие двойного щелчка от Style, так как это сценарий, требующий от вас вызова некоторого кода из ResourceDictionary.

0 голосов
/ 20 декабря 2011

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

0 голосов
/ 01 марта 2010

Я проверил, и это просто ошибка копирования прошлого. Я хорошо определил класс один раз.

0 голосов
/ 01 марта 2010

Атрибут x: Class определен дважды, поэтому вы получаете ошибку синтаксического анализатора. Измените свою декларацию на эту, и она должна работать:

<ResourceDictionary 
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   x:Class="SLProject.Templates.TVTemplate">
...