Как "слить" файл 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 эти два файла находятся рядом друг с другом. То, что я хотел бы сделать, это объединить эти два файла, как с помощью Control и его кода.
Что у меня: ![enter image description here]()
Что бы я хотел: ![enter image description here]()
Каков наилучший способ сделать это? Спасибо.
Ответы
Ответ 1
Вам нужно отредактировать файл .csproj. Найдите элемент <Compile>
для MyTemplate.cs и добавьте к нему элемент <DependentUpon>
:
<Compile Include="MyTemplate.cs">
<DependentUpon>MyTemplate.xaml</DependentUpon>
</Compile>
Смотрите это сообщение в блоге: сделать элемент проекта дочерним элементом другого
Ответ 2
Это не ответ на ваш первоначальный вопрос, а на следующее:
В этом случае объясните, как добавить обработчик событий в шаблон без использования кода
Вы можете сделать это с помощью класса 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;
}
Добавьте экземпляр вашего командного класса в класс ViewModel, сделайте его приватным и выставьте его через свойство только для чтения:
public class ViewModel
{
private readonly ICommand _command = new Command();
public ICommand Command
{
get { return _command; }
}
}
Добавьте свой ViewModel в качестве статического ресурса в файл App.xaml:
<Application.Resources>
<wpfApplication1:ViewModel x:Key="ViewModel"/>
</Application.Resources>
Установите свой DataContext вашего файла XAML в ViewModel:
<Window DataContext="{StaticResource ViewModel}">
Теперь ответьте на свое событие, привязав к классу Command:
<Button Click="{Binding Command}"></Button>
Бум, без кода. Надеюсь, это поможет.
Ответ 3
Другой способ:
- Добавить/Создать новый файл/элемент XAML
- Скопируйте и вставьте старый .xaml и xaml.cs контент в новые эквивалентные файлы.
- удалить отдельные файлы
- переименуйте новый файл
Ответ 4
Если вы действительно чувствуете необходимость комбинировать фрагменты кода с 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;