我创建了一个办公室加载项,它包含一个WPF应用程序的实例.当用户单击加载项上的按钮时,我通过执行以下操作启动不同的窗口:
MyViewModel viewModel = new MyViewModel(string infoFromOffice);
MyWindow view = new MyWindow();
view.DataContext = viewModel;
wpfApp.Run(view);
Run Code Online (Sandbox Code Playgroud)
在我调用之前构建视图模型我wpfApp.Run()稍后使用当前的SynchronizationContext命中probelms.这里的答案解释了原因.有没有更好的方法从办公室加载项启动WPF窗口?
我有一个ListBox项目集合,它们具有用于生成结果的ID GetHashCode().添加新项目时,它的ID为0,直到它首次保存到我们的数据库中.这导致我ListBox抱怨; 我相信原因是因为当一个项目首次被ListBox它使用时,它存储在一个Dictionary不希望哈希码改变的内部.
我可以通过从集合中删除未保存的项来解决这个问题(我必须在此阶段通知UI将其从字典中删除),保存到数据库,然后将其添加回集合中.这很麻烦,我并不总是可以从我的Save(BusinessObject obj)方法访问该集合.有没有人有这个问题的替代解决方案?
编辑在回应Blam的回答:
我正在使用MVVM,所以我修改了代码以使用绑定.要重现问题,请单击"添加",选择项目,单击"保存","重复",然后尝试进行选择.我认为这表明它ListBox仍然保留在其内部的旧哈希码中Dictionary,因此冲突的键错误.
<Window x:Class="ListBoxHashCode.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
<Button Click="Button_Click_Add" Content="Add"/>
<Button Click="Button_Click_Save" Content="Save Selected"/>
</StackPanel>
<ListBox Grid.Row="1" ItemsSource="{Binding List}" DisplayMemberPath="ID" SelectedItem="{Binding Selected}"/>
</Grid>
</Window>
public partial class MainWindow : Window {
public ObservableCollection<ListItem> List { get; private set; }
public ListItem Selected { get; set; } …Run Code Online (Sandbox Code Playgroud) 编译器是否同样处理下面两种情况,或者情况2是否提供了性能提升,因为x/2不会经常重新评估?我总是假设后者,但如果有人能证实这一点,那将会很棒.
情况1:
double result;
for (int i = 0; i < 10000000; i++) {
result += variables[i] * (x/2);
}
return result;
Run Code Online (Sandbox Code Playgroud)
案例2:
double result;
double xOverTwo = x/2;
for (int i = 0; i < 10000000; i++) {
result += variables[i] * (xOverTwo);
}
return result;
Run Code Online (Sandbox Code Playgroud) 我试图通过使用Windows执行的相同COM预览处理程序在我的应用程序中进行文件预览.我正在使用此处找到的代码.在我的家用机器上,这适用于所有文件类型但是在工作时,创建COM处理程序的实例会在大多数情况下抛出以下错误:
System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM
class factory for component with CLSID {DC6EFB56-9CFA-464D-8880-44885D7DC193}
failed due to the following error: 80080005 Server execution failed (Exception
from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
Run Code Online (Sandbox Code Playgroud)
抛出错误的代码是:
object previewer = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)
其中type是Type使用应用程序GUID检索的.我已经在网上和SO上看了一眼,尽管这个问题看起来很普遍,但我还是找不到解决方案.