小编Cod*_*095的帖子

从Office启动WPF窗口添加

我创建了一个办公室加载项,它包含一个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窗口?

c# wpf ms-office mvvm office-addins

8
推荐指数
1
解决办法
3593
查看次数

WPF ListBox和具有更改Hashcode的项目

我有一个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)

c# wpf listbox mvvm

5
推荐指数
1
解决办法
1544
查看次数

预先计算循环中使用的常量(或其他任何地方)是否有益?

编译器是否同样处理下面两种情况,或者情况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)

c# loops constants

1
推荐指数
1
解决办法
144
查看次数

在某些计算机上创建COM预览处理程序的实例失败

我试图通过使用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上看了一眼,尽管这个问题看起来很普遍,但我还是找不到解决方案.

c# com wpf interop

0
推荐指数
1
解决办法
1913
查看次数

标签 统计

c# ×4

wpf ×3

mvvm ×2

com ×1

constants ×1

interop ×1

listbox ×1

loops ×1

ms-office ×1

office-addins ×1