У меня есть большое решение WPF, работающее около 2 лет.Теперь мы запускаем автоматизированную среду сборки для этого решения, когда произошло самое странное.
В 50% наших сборок я получаю эту ошибку:
Исключение: невозможно преобразовать объект типа «System.Windows.Controls.StackPanel» в тип «System.Windows.Controls.Border».Ошибка в объекте 'System.Windows.Controls.StackPanel' в файле разметки ...
Это кажется достаточно простым.Проблема в том, что мой код выглядит следующим образом:
<UserControl x:Class="SiSM.Episode.Mishap.SpecializationList" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Converters="clr-namespace:Utils.Converters;assembly=Utils" ...>
<Border x:Name="root" BorderThickness="0.5">
<StackPanel x:Name="stackPanelRoot" VerticalAlignment="Stretch">
<Grid>
...
</Grid>
<StackPanel>
...
</StackPanel>
<ScrollViewer>
...
</ScrollViewer>
</StackPanel>
</Border>
</UserControl>
Ошибка здесь, потому что, если я переключаю стековую панель для док-панели, сообщение об ошибке меняется на док-панель.
Моя среда сборкивыглядит следующим образом:
Скопируйте код в папку сборки:
private void CopyCode(string sourceDir, string destinationDir) {
foreach (string dirPath in Directory.GetDirectories(sourceDir, "*", SearchOption.AllDirectories)) {
if (!dirPath.Contains(".svn") && !dirPath.Contains(@"\bin") && !dirPath.Contains(@"\obj")) {
Directory.CreateDirectory(dirPath.Replace(sourceDir, destinationDir));
}
}
foreach (string newPath in Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories)) {
if (!newPath.Contains(".svn") && !newPath.Contains(@"\bin") && !newPath.Contains(@"\obj")) {
string dest = newPath.Replace(sourceDir, destinationDir);
File.Copy(newPath, dest);
}
}
Worker.ReportProgress(5, "Copy done");
}
И соберите решение:
private void Compile(string buildConfiguration) {
Engine engine = new Engine();
FileLogger logger = new FileLogger { Parameters = @"logfile=C:\builds\build.log" };
engine.RegisterLogger(logger);
BuildPropertyGroup bpg = new BuildPropertyGroup();
bpg.SetProperty("Configuration", buildConfiguration, true);
engine.GlobalProperties = bpg;
var project = new Project(engine);
project.Load(ProjectFilePath);
bool success = engine.BuildProject(project);
engine.UnregisterAllLoggers();
}
Что-то здесь не так или есть какие-либо известныепроблема с WPF и механизмом сборки Microsoft?
Редактировать 1
Я обнаружил, когда произошла ошибка.Если я запускаю приложение автоматической сборки в первый раз, оно всегда завершается успешно, но если я запускаю его несколько секунд, возникает вышеуказанная ошибка.Вероятно, это то, что я забыл закрыть, создавая ошибку.
Я добавил engine.Shutdown();
в конце метода Compile, но это не решило проблему.
Edit 2
Благодаря предложению @swiszcz, нашел самую странную вещь.Файл SpecializationList.g.cs (в папке obj) изменяется между первой и второй сборкой
Первая сборка
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.stackPanelRoot = ((System.Windows.Controls.StackPanel)(target));
return;
case 2:
#line 63 "..\..\..\Mishap\SpecializationList.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.buttonShowGlobalView_Click);
...
Вторая сборка
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 2:
this.stackPanelRoot = ((System.Windows.Controls.StackPanel)(target));
return;
case 3:
...
Увеличивается на 1в состоянии коммутатора и во второй сборке он не может преобразовать Button (вариант 2) в StackPanel (вариант 1).