我正在尝试提供设计时数据服务,以便我可以在 XAML 中使用一些数据。 我正在使用 OpenhardwareMonitor 库来获取 PC 的硬件信息。
我有代码可以提取“SensorType.Power”类型的所有传感器,并在 ItemsControl 中显示它们:
<ItemsControl
ItemsSource="{Binding Sensors}"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"
Height="100"
Margin="5,5,5,0"
Grid.Row="0">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type models:HardwareSensorCollection}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="{Binding Hardware, Converter={StaticResource HardwareNameTypeConcatConverter}}" Grid.Row="0" />
<ItemsControl ItemsSource="{Binding PowerSensors}" DisplayMemberPath="Name" Grid.Row="1" Margin="5,0,0,0" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
获取传感器的代码(在运行时)在我视图的 Loaded 事件中执行。在设计时,我简单地将视图模型称为 Loaded() 方法。我正在使用 MVVM,因此我使用以下内容将其传递到我的视图模型:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<cmd:EventToCommand Command="{Binding Mode=OneWay, Path=LoadedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
获取传感器的代码一切都很好,并且在运行时完美运行。但是,当在设计时执行时,它会在 Visual Studio 的设计视图中生成以下错误:
FileNotFoundException: Could not load file or assembly 'OpenHardwareMonitorLib, Version=0.7.1.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
at PowerMonitor.DesignData.DesignDataService.<>c__DisplayClass0.<GetHardwareSensorCollections>b__1()
at System.Threading.Tasks.Task`1.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at PowerMonitor.ViewModels.MainViewModel.<Loaded>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__3(Object state)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
我在VS 2015中工作,但在VS 2013中出现同样的错误。
我想,也许它在运行设计时无法获取传感器,所以我创建了几个继承 IHardware 和 ISensor 的类,这样我就可以像这样初始化它:
var hardwareCollection1 = new HardwareSensorCollection(new DesignHardware("Example Hardware 1", HardwareType.CPU));
hardwareCollection1.PowerSensors.Add(new DesignSensor("Example Sensor 1", SensorType.Power));
hardwareCollection1.PowerSensors.Add(new DesignSensor("Example Sensor 2", SensorType.Power));
var hardwareCollection2 = new HardwareSensorCollection(new DesignHardware("Example Hardware 2", HardwareType.CPU));
hardwareCollection2.PowerSensors.Add(new DesignSensor("Example Sensor 1", SensorType.Power));
hardwareCollection2.PowerSensors.Add(new DesignSensor("Example Sensor 2", SensorType.Power));
hardwareCollection2.PowerSensors.Add(new DesignSensor("Example Sensor 3", SensorType.Power));
hardwareCollection2.PowerSensors.Add(new DesignSensor("Example Sensor 4", SensorType.Power));
return new List<HardwareSensorCollection> { hardwareCollection1, hardwareCollection2 };
但这给了我同样的错误。
我发现了一些有类似问题的人提出的问题,但他们的解决方案都不适合我。我想我必须把这个 DLL 放在某个地方,以便 VS 在调用设计时代码时可以找到它。
有什么想法吗?
如果您在 XAML 设计器中遇到此类问题(无法加载文件或程序集),则可能是由于平台所致。我收到这样的消息:
Attempting to load a program with an incorrect format.
在我的输出窗口中,我通过在解决方案配置中从 AnyCPU 切换到 x64 解决了问题。
我确认了。项目之间的平台配置差异也可能导致这个问题。
这个问题还没有解决。
如果您希望设计器正常工作,您需要确保依赖树中的所有项目都使用相同的平台配置。