小编Hus*_*lil的帖子

如何从工作线程中调用UI线程上的方法?

我正在开发一个使用以下技术的项目:

  • C#(.NET 4.0)
  • WCF
  • 棱镜4

我目前正在使用代理生成的Begin/End方法对我们的某个Web服务进行异步调用.调用成功,客户端能够在工作线程上接收Web服务的响应.

收到回复后,我继续举办活动.订阅该事件的类继续使用PRISM请求UI导航:

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
    this.RegionManager.RequestNavigate(RegionNames.LoginContentRegion, projectSelectionViewUri)));
Run Code Online (Sandbox Code Playgroud)

由于未在UI线程上捕获异步WCF响应,因此我不得不使用调用UI线程Application.Current.Dispatcher.BeginInvoke(...).

这里的问题是调用似乎什么都不做.UI未更新,不会引发异常.

我应该如何从工作线程中引发的事件中调用UI线程?

编辑:此问题已在以下链接中重新询问,因为假设的副本未提供答案:

在异步WCF响应线程上使用PRISM 4请求UI导航

c# wpf wcf multithreading prism

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

WPF Listbox Virtualization创建DisconnectedItems

我正在尝试使用WPF ListBox创建Graph控件.我创建了自己的Canvas,它来自VirtualizingPanel,我自己处理项目的实现和虚拟化.

然后将列表框的项面板设置为我的自定义虚拟化画布.

我遇到的问题发生在以下场景中:

  • 首先创建ListBox项目A.
  • 列表框项目B在画布上的项目A的右侧创建.
  • 列表框项目A首先被虚拟化(通过将其平移到视图之外).
  • ListBox项目B被第二次虚拟化(再次通过将其平移到视图之外).
  • 将ListBox项目A和B置于视图中(即:实现它们)
  • 使用Snoop,我检测到ListBox现在有3个项目,其中一个是直接位于ListBox项目B下面的"DisconnectedItem".

是什么导致了这个"DisconnectedItem"的创建?如果我首先虚拟化B,然后是A,则不会创建此项目.我的理论是,虚拟化ListBox中其他项之前的项会导致子项断开连接.

使用包含数百个节点的图表时问题更加明显,因为当我平移时,我最终会收到数百个断开连接的项目.

以下是画布代码的一部分:

/// <summary>
/// Arranges and virtualizes child element positionned explicitly.
/// </summary>
public class VirtualizingCanvas : VirtualizingPanel
{
   (...)

    protected override Size MeasureOverride(Size constraint)
    {
        ItemsControl itemsOwner = ItemsControl.GetItemsOwner(this);

        // For some reason you have to "touch" the children collection in 
        // order for the ItemContainerGenerator to initialize properly.
        var necessaryChidrenTouch = Children;

        IItemContainerGenerator generator = ItemContainerGenerator;

        IDisposable generationAction = null;

        int index = 0;
        Rect visibilityRect …
Run Code Online (Sandbox Code Playgroud)

.net c# wpf virtualization

13
推荐指数
2
解决办法
5244
查看次数

WPF Datagrid:清除列排序

我在我的应用程序中使用WPF Datagrid,可以通过单击标题对列进行排序.

我想知道是否有任何方法可以以编程方式清除列的排序?

我尝试对列进行排序然后清除MyDataGrid.Items.SortDescriptions,但该集合为空(即使已对一列进行了排序).

我也尝试过:

MyDataGridColumn.SortDirection = null;
Run Code Online (Sandbox Code Playgroud)

问题是列指示消失了,但是在编辑单元格和切换行时仍然会发生排序.

有没有办法清除列的排序?

编辑(为清晰起见):问题是,如果用户重新点击相同的列标题,我想再次允许排序,因此将CanUserSort设置为false会有问题,即使它是在XAML中完成的.简而言之,我正在尝试做的是,一旦已排序的列具有已修改的单元格,就会阻止对行进行排序.我想强制用户重新点击标题.

c# wpf wpfdatagrid

12
推荐指数
3
解决办法
1万
查看次数

Perforce API的.net包装器?

我目前正在开发.NET 4中的应用程序,该应用程序必须与Perforce服务器进行交互.

我的团队之前使用Perforce API开发了某种包装器,但它缺少了很多用例,并且没有正确处理异常.简而言之,它不是我可以真正使用的东西,因为它需要相当大的努力才能使其尽可能"防弹".

我想知道是否存在适用于处理异常的.NET的Perforce API包装器?

在我评估内部包装器的可用性时,我想出了一个我们的应用程序需要处理的异常和用例列表(并且包装器需要抛出).

这个清单非常详尽,这让我想知道是否已经存在某种包装.

.net c# perforce

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

WPF - 组样式:我们只能绑定到"名称"属性吗?

我正在尝试创建一个ItemsControl,负责显示按元数据排序的各种项目.每个项目可以有多个元数据.例如,"Conversation"类型的项可以具有"Chapter","Act"和"Volume"元数据.

在搜索分组在WPF中的工作方式后,我发现了GroupStyles和PropertyGroupDescription类.

我创建了自己的类,它继承自PropertyGroupDescription并返回"Metadata"类型的对象.

无论如何,在我的ItemsControl的GroupStyle DataTemplate中,我可以绑定到返回的对象(即:"元数据"对象),然后按我的意愿显示其属性?还是我被迫绑定到"姓名"?

换一种说法:

<ItemsControl.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                  Am I forced to bind to "Name" here ?
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ItemsControl.GroupStyle>
Run Code Online (Sandbox Code Playgroud)

.net c# wpf .net-4.0

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

C#:无法撤消插入的文本

我使用KeyPress事件以编程方式在自定义RichTextBox中添加文本:

SelectedText = e.KeyChar.ToString(); 
Run Code Online (Sandbox Code Playgroud)

问题是以这种方式插入文本不会触发CanUndo标志.

因此,当我尝试撤消/重做文本时(通过调用文本框的Undo()和Redo()方法),没有任何反应.

我尝试以编程方式从TextChanged()事件中唤起KeyUp()事件,但仍未将CanUndo标记为true.

如何撤消插入的文本而不必为撤消和重做操作创建列表?

谢谢

c# undo redo winforms

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

所有模块加载后是否可以显示shell?

我目前正在开发一个使用PRISM 4在不同模块中划分其功能的应用程序.

我注意到我的应用程序的Shell在模块加载之前加载并显示了模块在其区域中的视图.

这意味着首先显示Shell,并且稍后(大约半秒)显示Shell,加载模块并将视图插入Shell的区域.这是相当烦人的,因为用户在启动时遇到空壳,这不是很专业.

有没有办法检测何时加载了所有模块?我可以在引导程序中覆盖的任何方法?

如果可以,我想隐藏Shell(或显示加载装饰器),直到所有模块都已加载.

.net c# wpf prism

6
推荐指数
2
解决办法
2012
查看次数

WPF中的上下文文本编辑器

我们目前正在寻找在WPF(.NET 4.0)中创建文本编辑器,这将允许我们团队中的编写者创建电影脚本.简而言之,功能应该重新组合FinalDraft或Adobe Story(即:文本的上下文定位,具体取决于光标的位置和用户意图)

我们目前正在设计两种不同的解决方案:

  • 一个WPF控件将充当容器,多个小文本编辑控件将表示脚本中的行.这将允许我们使用它们的边距定位控件,同时还使绑定变得容易.这里的挑战是处理多线选择.我在考虑使用Listbox作为容器,每个列表框项目都是包含文本框的自定义控件.这将需要根据用户的操作实例化控件.所有内容都会被剥皮,以给人一种用户正在处理空白页面的印象.

  • 一个能够显示自定义XML数据的大文本框.这里的挑战是确定光标的确切位置(即:光标位于演员姓名的顶部等)并适当地定位文本(即:演员名称居中且以大写字母等)

我最近尝试实现第一个解决方案,但必须重新实现基本文本框中内置的整个选择行为是非常重要的,需要大量工作.至于第二种解决方案,绑定到我的业务对象将比简单地使用不同的绑定实例化多个控件要困难得多.

你还有其他解决方案吗?

.net c# wpf

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

使用哪种设计模式将允许的操作分配给用户类型?

我正在开发一个C#(.NET 4.0)系统,它将被各种用户使用.

每个用户类型只允许以特定方式与应用程序交互.例如,用户A应该只能执行操作1,2和3.用户B应该只能执行操作2,3和4等.

我决定实现一个名为"Role"的接口,它由各种类实现,例如"Administrator","Reader"等.用户可能有多个角色(定义为"角色"列表).

我希望每个角色("管理员","读者"等)都有一个允许的操作列表.我想在某个地方定义一个enum,它将包含应用程序中可能的所有操作.然后,每个"角色"将具有在该枚举中找到的项目列表.

我觉得这个没有经过优化,因为我必须始终确保在我的应用程序中实现新功能时保持这个enum的最新状态.

你会建议我使用什么方法?有没有可以帮助我的设计模式?

.net c# design-patterns access-control

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

WCF:使用局部类拆分复杂的Web服务?

我目前正在开发Web服务,该服务应公开相对大量的交互方式。

例如,客户端可能能够与Web服务进行交互,以管理数据库中的用户或项目。

为此,我创建了以下类:

  • 两个数据合同:IUsersServiceContract和IProjectsServiceContract
  • 两个服务合同接口:IUsersServiceContract和IProjectsServiceContract

我的问题如下:

创建两个不同的Web服务(每个都有各自的端点),而不是创建一个同时实现两个服务合同接口的大类,是否有意义?

请记住,实际上,我将拥有更多的服务合同接口来处理不同类型的数据。

据我了解,使用局部类(拆分为多个文件)将使我能够创建一个只有一个端点的大型Web服务。

这样做的缺点是不能将一个大类拆分为多个文件,即:如果开发人员“看不到大图”,则它较难维护,并且更容易出错。

另一种解决方案是为每个服务合同接口实现一个Web服务。

本质上,如果我具有X服务合同接口,那么最终会获得带有X端点的X Web服务。

您会选择哪种解决方案,为什么?

感谢您的输入 !

wcf web-services partial

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