我有一个从C#应用程序调用的非托管C++ DLL,我试图让C#应用程序捕获所有异常,以便在由于非托管异常导致dll失败的情况下,用户将得到一个半合适的错误消息(C#app是一个实现它自己的http处理程序的Web服务).
我遇到的问题是并非所有类型都被捕获.因此,如果我创建以下内容并执行C#应用程序,则dll会抛出错误并终止整个应用程序.有任何想法吗?
这是在VS2005中使用.Net framework v2创建的
C++ - Test.h
#ifndef INC_TEST_H
#define INC_TEST_H
extern "C" __declspec(dllexport) void ProcessBadCall();
#endif
Run Code Online (Sandbox Code Playgroud)
C++ - Test.cpp
#include <iostream>
#include <vector>
using namespace std;
void ProcessBadCall()
{
vector<int> myValues;
int a = myValues[1];
cout << a << endl;
}
Run Code Online (Sandbox Code Playgroud)
C# - Program.cs
class Program
{
[DllImport("Test.dll", EntryPoint="ProcessBadCall")]
static extern void ProcessBadCall();
static void Main(string[] args)
{
try
{
ProcessBadCall();
}
catch (SEHException ex)
{
Console.WriteLine("SEH Exception: {0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Exception: {0}", …
Run Code Online (Sandbox Code Playgroud) 我有一个CollectionChanged
与之相关的事件ObservableCollection
.CollectionChanged
然后,此事件调用另一个函数,该函数旨在使用原始集合中的项更新另一个集合(相同类型).我已经阅读了" 在CollectionChanged事件期间无法更改ObservableCollection "的其他帖子,我完全理解为什么修改CollectionChanged
事件内部的集合以及为什么这会导致循环引用...但在这种特殊情况下我没有修改原始集合,我只是将一个项目添加到一个不相关的集合中.
所以对我的问题......我在做什么有什么不对吗?我没有看到如何将集合中的项目与绑定到另一个集合的事件相关联,然后再次触发事件并创建循环引用(尽管请告诉我,如果我错了).
还有...周围有什么办法吗?我读了几篇帖子,建议在一个单独的线程上运行它,但是当我尝试时,我得到了以下错误.
This type of CollectionView does not support changes to its SourceCollection
from a thread different from the Dispatcher thread.
Run Code Online (Sandbox Code Playgroud)
我真的只是在更好地了解这里发生的事情之后.任何建议将不胜感激.
编辑
请求的简化示例
void originalCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
update(originalCollection);
}
private void update(object parameter)
{
foreach (var originalCollectionItem in parameter)
newCollection.Add(originalCollectionItem);
}
Run Code Online (Sandbox Code Playgroud) 我想要一个可以的Custom DataGrid,
ComboBox
非组合框,则组合框应该是DropDownOpen.请帮帮我.我在过去的几天里一直在尝试创建一个Custom DataGrid并编写了一些代码
protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
Run Code Online (Sandbox Code Playgroud)
但我失败了.
我刚刚开始使用resharper,我正在尝试学习所有热键 - 是否有标准安装的所有热键列表?这可能是可打印的格式.
我正在创建一个WPF数据网格,我希望能够通过拖放重新排序行,如下所示:我单击一行并向上或向下拖动它.像我一样,如果我释放鼠标,标记会显示行将被丢弃的位置.当我释放鼠标时,拖动的行将插入标记指示的位置.
有没有人看到任何文章或博客文章,说明如何做到这一点?如果我不需要,我不想重新发明轮子,谷歌也没有发现任何东西.谢谢.
假设我有ObservableCollection
员工类
public ObservableCollection<Employee> employeeCollection = new ObservableCollection<Employee>();
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public double MobileNumber { get; set; }
public string City { get; set; }
public int Age { get; set; }
public Employee() {}
}
Run Code Online (Sandbox Code Playgroud)
现在我试图ObservableCollection
通过用户从组合框中进行适当的选择来对("employeeCollection")进行排序[它将... ...排序FirstName ... .Sort By MobileNumber等...]
并且需要返回已排序的可观察集合....
意味着它不应该是"var"的形式
ObservableCollection<Employee>
所以我可以将它归还给...的“ItemsSource”
财产“ItemsControl”
谢谢……
我试图实现类似于iPhone消息视图的东西.在按钮上单击,删除按钮将滑出每个消息,单击"完成"删除按钮将滑入.我已经能够使用mvvm实现,除了滑动效果.这是我用我有限的知识写的风格:
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding ShowDeleteButton}" Value="false">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
这里"ShowDeleteButton"是视图模型中的bool属性.这很好用.但是崩溃和"变得可见"正在突然而且非常快地发生.我需要一些滑动动画.请注意,当删除按钮消失时,其余控件应占用剩余空间,并且当按钮出现时,现有控件应缩小并为按钮提供空间.我试过故事板动画,但即使几个小时后我也无法弄清楚它投掷的奇怪错误.这是代码:
<DataTrigger Binding="{Binding ShowDeleteButton}" Value="false">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard BeginTime="0:0:1">
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visiblity">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard BeginTime="0:0:1">
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visiblity">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
有人可以帮助陷入困境的灵魂吗?
问候
我有一个ListView
可能包含很多物品,所以它是virtualized
和回收物品.它不使用排序.我需要刷新一些值显示,但是当项目太多时,更新所有内容的速度太慢,所以我只想刷新可见项目.
我怎样才能获得所有当前显示的项目列表?我试图调查ListView
或者在里面ScrollViewer
,但我仍然不知道如何实现这一目标.如果可以看到解决方案,解决方案不得通过所有项目进行测试,因为这样做太慢了.
我不确定代码或xaml是否有用,它只是一个Virtualized
/ Recycling ListView
它ItemSource
与一个绑定Array
.
编辑:
答案:
感谢akjoshi,我找到了方法:
得到ScrollViewer
的ListView
(有FindDescendant
方法,你可以做你自己用VisualTreeHelper
).
读取它ScrollViewer.VerticalOffset
:它是显示的第一个项目的编号
ScrollViewer.ViewportHeight
:它是显示的项目数.CanContentScroll
必须是真的.我是一个很好的Visual Studio解决方案和项目结构的坚持者.
我即将开始WPF概念证明工作.
任何人都可以推荐一些他们使用过的WPF项目结构并且发现效果很好吗?
这里http://drwpf.com/blog/2007/10/01/58/
他们有一个我喜欢的建议:
Root
- Pages
- Controls
- Resources
App.xaml
Run Code Online (Sandbox Code Playgroud)
页面,控件和资源是文件夹.
有没有人发现某些结构运作良好/不能正常工作?
此外,如果你们这样做,我宁愿不进入"模型视图演示者"讨论.
我想在启动时指定默认顺序,但仍然允许用户通过单击列标题进行排序.遗憾的是,SortDirection属性在设置时被忽略 - 即我们得到正确的列标题箭头,但没有任何排序.
手动单击标题,可以正确排序数据,因此不是排序本身.这是我正在使用的简化版本:
<DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=CurrentView}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Header 1" Binding="{Binding ApplicationName}"/>
<DataGridTextColumn Header="Header 2"
Binding="{Binding TotalTime}" SortDirection="Descending"/>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
更新:我还尝试按照建议将SortDescriptions添加到ICollectionView,但没有很好的结果.这可能与我正在动态地向集合中添加新项目这一事实有关吗?即在启动时列表是空的并且慢慢填充,也许排序描述只应用一次?