XAML设计器卡死

在生成工程时,存在这样一个记录:

“未能找到一个或多个间接引用的程序集。分析不需要这些程序集。但是,如果没有这些程序集,分析结果可能不完整”。

表现形式既不是错误,可也不是警告。之所以关注到这个问题,是因为XAML设计器总是卡死。

 

因为编译能通过,所以以为是工程同步上出了问题。新建工程,重新添加,结果只要一打开XAML设计器,就死掉。试了很多次,依然如此。经过一段时间,终于将问题移到此上面,考虑到XAML设计器实际在后台运行代码,这就考虑到硬件DLL。因为其他库都是通过NuGget添加,理论上出问题的可能性比较小。

 

果然,删除掉硬件DLL之后,设计器恢复正常。再次添加硬件DLL,再次死掉。此问题可以重现,说明问题在于此。

 

当然,忽略XAML设计器,程序是可以生成并运行的——不过App只使用了部分硬件逻辑代码,也没有连接操作硬件。

 

转载于:https://www.cnblogs.com/jjseen/p/5159755.html

<Window x:Class="DoubleArmSimulation.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DoubleArmSimulation" xmlns:converters="clr-namespace:DoubleArmSimulation.Converters" mc:Ignorable="d" Title="双机械臂模拟系统" Height="750" Width="950"> <Window.Resources> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <StackPanel Grid.Column="0" Width="200" Background="AntiqueWhite" Margin="10"> <!-- 串口--> <!--<GroupBox Header="串口设置" Margin="5"> <StackPanel> <ComboBox x:Name="cmbPort" Margin="5" ItemsSource="{Binding AvailablePorts}" IsEnabled="False"/> <Button Content="打开串口" Margin="5" Background="White" /> <Button Content="关闭串口" Margin="5" Background="White" /> </StackPanel> </GroupBox>--> <!-- 机械臂长度设置 --> <GroupBox Header="机械臂长度" Margin="5"> <StackPanel> <StackPanel Orientation="Horizontal" Margin="5"> <TextBlock Text="L1长度 (cm):" VerticalAlignment="Center" Width="90"/> <TextBox Width="60" Text="{Binding Arm1Length, UpdateSourceTrigger=PropertyChanged}"/> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5"> <TextBlock Text="L2长度 (cm):" VerticalAlignment="Center" Width="90"/> <TextBox Width="60" Text="{Binding Arm2Length, UpdateSourceTrigger=PropertyChanged}"/> </StackPanel> </StackPanel> </GroupBox> <!-- 坐标输入 --> <GroupBox Header="目标坐标输入" Margin="5"> <StackPanel> <StackPanel Orientation="Horizontal" Margin="5"> <TextBlock Text="X (cm):" VerticalAlignment="Center" Width="50"/> <TextBox x:Name="txtTargetX" Width="70" Text="{Binding TargetX, UpdateSourceTrigger=PropertyChanged}"/> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5"> <TextBlock Text="Y (cm):" VerticalAlignment="Center" Width="50"/> <TextBox x:Name="txtTargetY" Width="70" Text="{Binding TargetY, UpdateSourceTrigger=PropertyChanged}"/> </StackPanel> <Button Content="设置目标点" Margin="10" Height="25" Background="LightGreen" Command="{Binding SetTargetCommand}"/> </StackPanel> </GroupBox> <!-- 随机生成坐标按钮 --> <Button Content="随机生成坐标" Margin="10" Height="20" Background="LightGoldenrodYellow" Command="{Binding GenerateTargetCommand}"/> <!-- 画圆功能 --> <!--<GroupBox Header="画圆" Margin="5"> <StackPanel> <StackPanel Orientation="Horizontal" Margin="5"> <TextBlock Text="直径 (cm):" VerticalAlignment="Center" Width="70"/> <TextBox x:Name="txtDiameter" Width="90" Text="{Binding CircleDiameter, UpdateSourceTrigger=PropertyChanged}"/> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5"> <TextBlock Text="轨迹点数:" VerticalAlignment="Center" Width="70"/> <ComboBox x:Name="cmbPoints" SelectedValue="{Binding CirclePointCount}" SelectedValuePath="Tag"> <ComboBoxItem Content="16" Tag="16"/> <ComboBoxItem Content="32" Tag="32"/> <ComboBoxItem Content="64" Tag="64" IsSelected="True"/> <ComboBoxItem Content="128" Tag="128"/> </ComboBox> </StackPanel> <Button Content="开始" Margin="10" Height="30" Command="{Binding StartCircleCommand}"/> <Button Content="停止" Margin="10,0,10,10" Height="30" Background="LightBlue" Command="{Binding StopMotionCommand}"/> </StackPanel> </GroupBox>--> <!-- 位置信息显示 --> <GroupBox Header="当前位置信息" Margin="5,10,5,0"> <StackPanel> <TextBlock Text="{Binding CurrentPosition}" Margin="5"/> <TextBlock Text="{Binding JointAngles}" Margin="5"/> <TextBlock Text="{Binding SolutionType}" Margin="5"/> <TextBlock Text="{Binding MotionStatus}" Margin="5" Foreground="Blue" FontWeight="Bold"/> </StackPanel> </GroupBox> </StackPanel> <Grid Grid.Column="1" Margin="10"> <Canvas x:Name="canvas" Background="White"> </Canvas> </Grid> </Grid> </Window> 根据该MainWindow.xaml,请制作出项目 以下是实现思路 1.实现claer刷新每当随机目标点生成时使用 2.画(x,y)目标点 3.画出原点(0,0) 4.找到l1的末端 5.根据逆运算公式计算出(x1,y1的值) 6.将三点进行连线 using System; namespace DoubleArmSimulation.Models { public class RobotKinematicsModel { public double Length1 { get; } public double Length2 { get; } public InverseKinematicsSolution Solutions { get; private set; } public RobotKinematicsModel(double l1, double l2) { if (l1 <= 0 || l2 <= 0) throw new ArgumentOutOfRangeException("机械臂长度必须大于0"); Length1 = l1; Length2 = l2; } public bool CalculateIK(double x, double y) { const double tolerance = 1e-6; double d_sq = x * x + y * y; double maxReach = Length1 + Length2; double minReach = Math.Abs(Length1 - Length2); // 检查是否在原点 if (Math.Abs(x) < tolerance && Math.Abs(y) < tolerance) return false; // 检查是否在工作空间内 if (d_sq > maxReach * maxReach + tolerance || d_sq < minReach * minReach - tolerance) return false; // 计算θ₂余弦 double cosTheta2 = (d_sq - Length1 * Length1 - Length2 * Length2) / (2 * Length1 * Length2); cosTheta2 = Clamp(cosTheta2, -1.0, 1.0); double theta2 = Math.Acos(cosTheta2); double theta2_alt = -theta2; // 计算θ₁ double gamma = Math.Atan2(y, x); double beta = Math.Acos((Length1 * Length1 + d_sq - Length2 * Length2) / (2 * Length1 * Math.Sqrt(d_sq))); beta = Clamp(beta, 0, Math.PI); double theta1_up = gamma - beta; double theta1_down = gamma + beta; // 存储解决方案 Solutions = new InverseKinematicsSolution( NormalizeAngle(theta1_up), theta2, NormalizeAngle(theta1_down), theta2_alt ); return true; } public static double Clamp(double value, double min, double max) { return value < min ? min : value > max ? max : value; } private double NormalizeAngle(double angle) { angle %= 2 * Math.PI; if (angle > Math.PI) angle -= 2 * Math.PI; if (angle < -Math.PI) angle += 2 * Math.PI; return angle; } } }
最新发布
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值