我有一个Activity具有许多属性的对象.其中一个如下:
public ActivityStatus Status
{
get { return status; }
set { status = value; NotifyPropertyChanged("Status"); }
}
Run Code Online (Sandbox Code Playgroud)
该ActivityStatus班只有两个属性:
public Guid Guid
{
get { return guid; }
set { guid = value; NotifyPropertyChanged("Guid"); }
}
public string Name
{
get { return name; }
set { name = value; NotifyPropertyChanged("Name"); }
}
Run Code Online (Sandbox Code Playgroud)
和Equals方法:
public override bool Equals(object otherObject)
{
if (!(otherObject is ActivityStatus)) return false;
return Equals(otherObject as ActivityStatus);
}
public bool Equals(ActivityStatus …Run Code Online (Sandbox Code Playgroud) 当我创建和使用这样的性能计数器时:
private readonly PerformanceCounter _cpuPerformanceCounter;
public ProcessViewModel(Process process)
{
_cpuPerformanceCounter = new PerformanceCounter("Process", "% Processor Time", process.ProcessName, true);
}
public void Update()
{
CPU = (int)_cpuPerformanceCounter.NextValue() / Environment.ProcessorCount; // Exception
}
Run Code Online (Sandbox Code Playgroud)
...我得到一个异常实例"实例的名称"在指定的类别中不存在,并且不理解原因.
PS代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<settings>
<performanceCounters enabled="true"/>
</settings>
</system.net>
</configuration>
Run Code Online (Sandbox Code Playgroud)
...包含在App.config中.
好吧,在你因为互联网上发布了数百个类似的声音问题而疯狂之前,我可以向你保证,我刚刚花了几个小时阅读所有这些问题并且没有找到我的问题的答案.
基本上,我的一个大型应用程序遇到了这样的情况:属性Binding上的某些s ListBox.SelectedItem将停止工作,或者在对当前所选项目进行编辑后程序将崩溃.我最初询问'已经添加了相同键的项目'从代码问题中选择ListBoxItem的例外,但没有得到答案.
直到本周,我才有时间解决这个问题.现在简而言之,我找出了问题的原因.这是因为我的数据类型类已经覆盖了Equals方法,因此也覆盖了方法GetHashCode.
现在对于那些不知道这个问题的人,我发现你只能GetHashCode使用不可变字段/属性来实现该方法.使用Harvey Kwok对Overriding GetHashCode()帖子的回答摘录来解释这个:
问题是Dictionary和HashSet集合正在使用GetHashCode将每个项目放在存储桶中.如果基于某些可变字段计算哈希码,并且在将对象放入HashSet或Dictionary后实际更改了字段,则无法再从HashSet或Dictionary中找到该对象.
所以实际问题是因为我在方法中使用了可变属性GetHashCode.当用户在UI中更改这些属性值时,对象的关联哈希码值会发生更改,然后在其集合中无法再找到项目.
所以,我的问题是处理我需要GetHashCode在没有不可变字段的类中实现方法的情况的最佳方法是什么?对不起,让我更加具体,因为该问题已被问过.
Overriding GetHashCode()帖子中的答案表明,在这些情况下,最好只返回一个常量值...一些建议返回值1,而其他建议返回一个素数.就个人而言,我看不出这些建议之间有任何区别,因为我认为只有一个桶用于其中任何一个.
此外,Eric Lippert博客中关于GetHashCode的指南和规则有一个标题为指南的部分:哈希码的分布必须是"随机的",这突出了使用导致使用不足的桶的算法的缺陷.他警告说,算法会减少使用的桶数,并在桶变得非常大时导致性能问题.当然,返回常数属于这一类.
我想到了Guid为我的所有数据类型类(仅在C#中,而不是数据库中)添加一个额外的字段,特别是在GetHashCode方法中使用.所以我想在这个长篇介绍的最后,我的实际问题是哪个实现更好?总结一下:
在没有不可变字段的类中重写Object.GetHashCode()时,最好从GetHashCode方法返回一个常量,还是readonly为每个类创建一个附加字段,仅用于GetHashCode方法?如果我应该添加一个新字段,它应该是什么类型,我不应该将它包含在Equals方法中?
虽然我很高兴收到任何人的答案,但我真的希望得到高级开发人员的答案,他们对这个主题有充分的了解.
对不起,标题很难理解.我不确定如何说出来.
我有一个应用程序,只允许每个用户会话运行一个实例.如果用户再次单击以启动应用程序,我希望将该应用程序重点关注.
该窗口可能具有折叠的可见性.
如果它可见,我知道我可以使用
if (IsIconic(hWnd))
{
ShowWindowAsync(hWnd, swRestore);
}
SetForegroundWindow(hWnd);
Run Code Online (Sandbox Code Playgroud)
但是如果窗户折叠了,有没有办法让我把它带回可见的?
可以使用<marquee>HTML元素了吗?我的意思是,是否所有浏览器都支持它?我知道Twitter正在使用它,我认为这对于公告非常有用,我想使用它,但我不知道它是否能正常使用.有人知道吗?
快速问题......
我有一个ListBox与它的ItemsSource属性绑定到一个集合属性在视图模型,如下所示:
<ListBox Name="CollectionsListBox" ItemsSource="{Binding Activity.Timesheets}" />
Run Code Online (Sandbox Code Playgroud)
我Button在同一视图中也有两个对象.现在的问题是...我可以改变CollectionsListBox ItemsSource Binding从Activity.Timesheets到Activity.Attachments只使用XAML?
如果失败了,从viewmodel使用Command对象?
编辑>>>
我找到了一个简单的解决方案,使用RadioButtons代替Button了霍华德答案中的s:
<ListBox Name="CollectionsListBox">
<ListBox.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=TimesheetsButton,Path=IsChecked}" Value="True">
<Setter Property="ListBox.ItemsSource" Value="{Binding Activity.Timesheets}" />
<Setter Property="ListBox.ItemContainerStyle" Value="{StaticResource TimesheetStyle}" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=AttachmentsButton,Path=IsChecked}" Value="True">
<Setter Property="ListBox.ItemsSource" Value="{Binding Activity.Attachments}" />
<Setter Property="ListBox.ItemContainerStyle" Value="{StaticResource AttachmentStyle}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.Style>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助.
我们正在开发一个应用程序,必须由可能有一些涉及使用kinect来移动光标的视觉问题的人使用,因此我们需要使它比平常更大.但是,此应用程序不直接与kinect接口,因此我们无法使用其API.
我们使用WPF在C#(.NET 4.5)中编程.问题是在高分辨率设备中默认光标大小不能大于32x32像素或64x64像素.
我们首先尝试使实际的鼠标光标不可见,然后使用Graphics对象,使用Graphics.FromHwnd(applicationWindowHandler).它成功绘制图像,但它留下了过去光标位置的踪迹.
有没有办法使用常规的Windows鼠标光标,或至少一种方法来删除跟踪(如强制当前窗口刷新的"无效"方法)?
我们已经尝试过这些解决方案,但没有运气:
www.hsys.com/CustomCursorArticlePart1.htm
www.hsys.com/CustomCursorArticlePart2.htm
csharparticles.blogspot.it/2005/03/custom-drawing-cursors.html
我的节目由一个TreeView和两个contentPresenters地面组成.mainWindow,TreeView和每个contentPresenter都有自己的viewModels.
我想调用一个函数在mainWindowViewModel从TreeViewViewModel.
我需要这样做,因为mainWindowViewModel控件显示的内容contentPresenters,我想手动更新显示.
我猜我会做这样的事......
TreeViewViewModel:
public class TreeViewViewModel
{
//Do I need to declare the MainWindowVM?
public TreeViewViewModel() { ... }
private void function()
{
//Command that affects display
//Manually call function in MainWindowVM to refresh View
}
}
Run Code Online (Sandbox Code Playgroud)
我试图通过使用来访问MainWindowVM来自TreeViewViewModel:
public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }
Run Code Online (Sandbox Code Playgroud)
但它没有多大意义.因为MWVM不是DataContext的TreeViewViewModel.
我在我的viewmodel中验证用户输入并在任何值验证失败的情况下抛出验证消息.
我只需要将焦点设置为验证失败的特定控件.
知道怎么做到这一点?
我有一个使用ClickOnce发布的.NET应用程序.在大多数情况下,一切都适用于此过程,但每隔一段时间,用户将收到一个错误,抛出下面显示的消息而不是打开程序:
应用程序无法启动.联系应用程序供应商.

我在MSDN上找到了ClickOnce Deployments页面中的特定于故障排除的错误(在"附加错误"部分中):
错误信息
应用程序无法启动.联系应用程序发布者.
无法启动应用程序.联系应用程序供应商以获取帮助
描述
这些是无法启动应用程序时出现的一般错误消息,并且找不到其他特定原因.通常,这意味着应用程序以某种方式损坏,或者ClickOnce存储已损坏.
虽然它不是针对此问题显示的错误消息的完全匹配,但我认为它足够接近上述类别的错误.现在解决此问题的方法是简单地删除存储在...中的所有ClickOnce用户设置.
C:\Users\USERNAME\AppData\Local\Apps\2.0
Run Code Online (Sandbox Code Playgroud)
...所以问题是可以承受的,但我的问题是:
我该怎么做才能找出导致这些一般错误的原因,以便我可以阻止它们发生?
c# ×7
wpf ×6
mvvm ×3
.net ×2
data-binding ×2
class ×1
clickonce ×1
combobox ×1
exception ×1
gethashcode ×1
html ×1
itemssource ×1
kinect ×1
listbox ×1
marquee ×1
mouse-cursor ×1
mutable ×1
overriding ×1
setfocus ×1
viewmodel ×1