Как "объединить" файл XAML и его код с Visual Studio

у меня есть шаблон, определенный в файле XAML с именем 'MyTemplate.в XAML'. Этот шаблон использует файл кода с именем ' MyTemplate.cs'.

шаблон mytemplate.в XAML:

<ResourceDictionary x:Class="Project.Templates.MyTemplate">
    <DataTemplate ... />
</ResourceDictionary>

шаблон mytemplate.cs:

namespace Project.Templates
{
    public partial class MyTemplate : ResourceDictionary
    {
        ...
    }
}

в обозревателе решений Visual Studio эти два файла находятся рядом. Что я хотел бы сделать, так это собрать эти два файла вместе, как с элементом управления и его кодом.

что у меня есть: enter image description here

что я хотел бы иметь:enter image description here

каков наилучший способ сделать это? Спасибо.

4 ответов


вам нужно отредактировать .файл csproj. Найдите <Compile> элемент для MyTemplate.cs и добавьте <DependentUpon> элемент под ним:

<Compile Include="MyTemplate.cs">
  <DependentUpon>MyTemplate.xaml</DependentUpon>
</Compile>

см. это сообщение в блоге:сделайте элемент проекта дочерним элементом другого


другой способ:

  • добавить/создать новый файл / элемент XAML
  • скопируйте и вставьте старый .xaml и xaml.содержимое cs для новых эквивалентных файлов
  • удалить отдельные файлы
  • переименовать новый файл

Это не ответ на ваш первоначальный вопрос, но для этого:

в этом случае объясните, как добавить обработчик событий в шаблон без использования кода

вы можете сделать это с помощью ViewModel и класса ICommand.

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

затем создайте другой класс, который реализует ICommand интерфейс:

public class Command : ICommand
{
    public void Execute(object parameter)
    {
        //this is what happens when you respond to the event
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;
}

добавьте экземпляр класса command в класс ViewModel, сделайте его закрытым и предоставьте его через свойство только для чтения:

public class ViewModel
{
    private readonly ICommand _command = new Command();

    public ICommand Command
    {
        get { return _command; }
    }
}

добавьте ViewModel в качестве статического ресурса в приложение.файл xaml:

<Application.Resources>
     <wpfApplication1:ViewModel x:Key="ViewModel"/>
</Application.Resources>

установите DataContext вашего XAML-файла в ViewModel:

<Window DataContext="{StaticResource ViewModel}">

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

<Button Click="{Binding Command}"></Button>

бум, никакого кода. Надеюсь, это помогает.


если вы действительно чувствуете необходимость комбинировать фрагменты кода с XAML в WPF, вы можете использовать Attached Properties. Вы можете сохранить XAML в App.Resources и загрузите его и примените его из Attached Property. Я понимаю, что это не даст вам один файл для XAML и кода позади, но он работает хорошо.

вы можете зарегистрировать PropertyChangedCallback проводник в ваш Attached Property и в этом обработчике вы можете применить шаблон:

ControlTemplate controlTemplate = (ControlTemplate)Application.Current.
    FindResource("TextBoxTemplate");
if (textBox.Template != controlTemplate) textBox.Template = controlTemplate;