我有一些数据的两个视图:一个列表视图(一个ListBox现在,但我一直意味着切换到ListView)和一个奇特的图形表示在地图上.在任一视图中,用户都可以单击对象,并且将在两个视图中选择该对象.Multiselect也是可能的,因此每个ViewModel实例都有自己的IsSelected属性.
目前我绑定ListBoxItem.IsSelected到ViewModel.IsSelected,但是这只是工作,如果正常的ListBox不是虚拟化(见这里).不幸的是,禁用虚拟化会损害性能,而我的应用程序变得太慢了.
所以我必须再次启用虚拟化.为了保持ViewModel.IsSelected屏幕外项目的属性,我注意到ListBox并且ListView有一个SelectionChanged事件我可以(可能)用来将选择状态从传播ListBox/ListView到ViewModel.
我的问题是,如何反向传播选择状态?该SelectedItems属性ListBox/ListView是只读的!假设用户单击图形表示中的项目,但它在列表中是屏幕外的.如果我只是设置,ViewModel.IsSelected那么ListBox/ListView将不知道新的选择,因此如果用户单击列表中的其他项目,它将无法取消选择该项目.我可以打电话ListBox.ScrollIntoView给ViewModel,但有几个问题:
ListBox/ListView. 那么,亲爱的WPF专家,有什么想法吗?
编辑:我最终切换到Infragistics控件并使用一个丑陋而缓慢的解决方案.关键是,我不再需要答案了.
我需要SignalR开发人员的一些指导,这是调整HUB方法参数序列化的最佳方法.
我开始将我的项目从WCF轮询双工(Silverlight 5 - ASP.NET 4.5)迁移到SignalR(1.1.2).消息(数据契约)是基于接口的多态的.(与IMessage,MessageA:IMessage等一样 - 实际上存在由类实现的接口的层次结构,但它对于该问题并没有多大意义).(我知道多态对象不适合客户端,但客户端会将其作为JSON处理,并且只有在服务器端或客户端上才能映射到对象(如果它是.NET/Silverlight)
在集线器上我定义了这样的方法:
public void SendMessage(IMessage data) { .. }
Run Code Online (Sandbox Code Playgroud)
我创建了自定义JsonConverters并验证了可以使用Json.NET对消息进行序列化/反序列化.然后我用适当的设置替换了DependencyResolver中的JsonNetSerializer.同样在Silverlight客户端.到现在为止还挺好.
但是当我将消息从客户端发送到服务器(消息被正确地序列化为JSON - 在Fiddler中验证)时,服务器返回错误,该参数无法反序列化.在调试器的帮助下,我在SignalR中发现了一个错误(负责反序列化的JRawValue类在内部创建了自己的JsonSerializer实例,忽略了提供的一个).通过替换看起来很容易解决
var settings = new JsonSerializerSettings
{
MaxDepth = 20
};
var serializer = JsonSerializer.Create(settings);
return serializer.Deserialize(jsonReader, type);
Run Code Online (Sandbox Code Playgroud)
同
var serializer = GlobalHost.DependencyResolver.Resolve<IJsonSerializer>();
return serializer.Parse(jsonReader, type);
Run Code Online (Sandbox Code Playgroud)
但我也发现在未来版本的SignalR中将删除IJsonSerializer接口.基本上,我需要从HUB方法获取原始JSON(或字节流),以便我可以自己反序列化它,或者通过指定转换器等来调整序列化器的可能性.
现在我最终用JObject参数类型定义了方法:
public void SendMessage(JObject data)
Run Code Online (Sandbox Code Playgroud)
然后使用手动反序列化数据
JObject.ToObject<IMessage>(JsonSerializer)
Run Code Online (Sandbox Code Playgroud)
方法.但我更喜欢自定义序列化程序并在hub方法上使用类型/接口.关于下一个SignalR设计的"正确方法"是什么?
我还发现有可能从我的代码发送回客户端原始JSON,即使SignalR再次序列化对象.我怎么能实现这个目标?
在从事C++项目三年后,可执行文件已增长到4 MB.我想看看所有这些空间的去向.有没有一种工具可以报告最大的太空猪是什么?很高兴看到按类(类中的所有函数),模板(所有实例化)和库(多少属于C标准库和STL?exe中的每个库有多少?)的大小.
编辑:注意,我在Windows上使用Visual C++.
由于各种原因,我经常发现编写与.NET framework 2.0或3.5兼容或与.NET Compact Framework兼容的代码是可取的,但是新的.NET框架中有许多"小"特性是一个问题.在旧框架或Compact Framework中不可用.
例如,我发现扩展方法确实很有用,但编译器依赖System.Runtime.CompilerServices.ExtensionAttribute于此.您可以自己轻松定义此属性,然后在.NET Framework 2.0中使用扩展方法(在C#3.0+下).同样的,这是不是太硬手动定义小.NET 4种类型,如Tuple<T1,T2>和Lazy<T>.顺便说一句,如果你想在.NET 2.0中使用LINQ,你可以使用LinqBridge.
现在假设你ExtensionAttribute公开,以便你编写的其他程序集可以使用它.一开始就没问题,但是如果你想使用也有同样想法的第三方库呢?您添加对该库的引用,现在您有名称冲突.哎呀.
我还注意到一些新的库只适用于.NET 4.0或3.5,即使它们只有很小的依赖关系,可以使用兼容包或LinqBridge来解决.
如果旧的.NET版本的"兼容包"在一个小DLL中定义了这些小功能,你可以证明包括在任何规模的项目中,这肯定会很好.这样的事情存在吗?
更新:从沉默来判断,我想没有这样的事情.如果有兴趣,我可能会自己创建这样一个OSS库.所以我的新问题是,如果你在为.NET 2,.NET 3.5,.NETCF或Silverlight编写,你会想念.NET 4的哪些小功能(而不是像WCF/WPF这样的怪物)?我将开始列表......
ExtensionAttribute (不是在.NET 2中)Func<...>和Action<...>代表(不在.NET 2中)Tuple<...> (不是在.NET 3.5中)Lazy<T>和Lazy<T,TMetadata>(不是在.NET 3.5中)Reflection.Emit (缺少.NETCF;不是一个小功能,但我非常想念它)如果将Windows窗体控件的Visible属性设置为true,则如果隐藏任何控件的父窗口,该属性仍将返回false.有没有办法在隐藏父窗口的情况下获取控件的真实底层可见性标志?
我正在将一些C++代码转换为C#,并调用std :: map :: lower_bound(k)来查找映射中的键,该键的大小等于或大于k.但是,我没有看到任何方法与.NET的SortedDictionary做同样的事情.我怀疑我可以使用SortedList实现变通方法,但遗憾的是SortedList太慢(O(n)用于插入和删除键).我能做什么?
注意:我发现使用的解决方法利用了我的特定场景...具体来说,我的键是一个密集的整数,从0开始,所以我使用List <TValue>作为我的字典,列表索引作为密钥和搜索等于或大于k的密钥只能在几次循环迭代中完成.但是看到原来的问题得到解答仍然会很好.
据我所知,如果计算机没有使用默认的DPI设置,WPF坐标与"真实"屏幕坐标(像素坐标)不同.在我的程序中,我想(1)找出WPF窗口所在的监视器,以及(2)打开同一监视器左下角的另一个窗口.我听说WPF 没有相应的屏幕,所以我使用WinForms版本,如下所示,它在默认的96 DPI下工作正常:
public void ChooseInitialPosition(Window w) // w is some other window
{
var scr = System.Windows.Forms.Screen.FromRectangle(
new System.Drawing.Rectangle((int)w.Left, (int)w.Top, (int)w.Width, (int)w.Height))
.WorkingArea;
this.Left = scr.Right - Width;
this.Top = scr.Bottom - Height;
}
Run Code Online (Sandbox Code Playgroud)
但在其他DPI中,这两个步骤都不正确,并且可能会使窗口完全脱离屏幕.
到目前为止,看起来我可以在第一部分使用Visual.PointToScreen:
var p1 = w.PointToScreen(new Point(0,0));
var p2 = w.PointToScreen(new Point(w.Width,w.Height));
var scr = System.Windows.Forms.Screen.FromRectangle(
new System.Drawing.Rectangle((int)p1.X, (int)p1.Y, (int)(p2.X - p1.X), (int)(p2.Y - p1.Y))).WorkingArea;
Run Code Online (Sandbox Code Playgroud)
我不确定这是否正确,因为它可能无法正确解释边界.但第二部分更重要.如何将屏幕矩形"scr"转换为WPF空间,以便正确设置Left和Top?
我想在C#中操纵浮点数的按位表示.BinaryWriter和BinaryReader这样做:
public virtual unsafe void Write(double value)
{
ulong num = *((ulong*) &value);
...
}
public virtual unsafe double ReadDouble()
{
...
ulong num3 = ...;
return *((double*) &num3);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有不安全代码的情况下执行此操作,并且没有实际使用BinaryWriter和BinaryReader的开销?
我的C++代码中出现的大多数错误导致应用程序只是退出,没有任何LogCat输出,并且设备上没有消息.空指针和错误使用JNI经常产生这个结果,不用说,它使调试变得非常困难.
目前我可以在ndk-gdb中使用'bt'命令获取堆栈跟踪,但是如果崩溃发生在启动的前2秒内则不会,因为ndk-gdb启动进程并在启动后附加到它.另外,ndk-gdb是不可靠的,经常说它找不到任何符号,或抱怨非致命的"SIGILL"错误.
有没有办法在应用程序崩溃时捕获错误并打印堆栈跟踪或其他信息?例如,如果有SIGSEGV,我想知道该应用尝试访问的地址.
我想制作一个看起来完全像按钮的CheckBox.我最初的微弱尝试根本不起作用.
<CheckBox x:Name="test">
Testing!
<CheckBox.Template>
<ControlTemplate>
<Button>
<ContentPresenter/>
</Button>
</ControlTemplate>
</CheckBox.Template>
</CheckBox>
Run Code Online (Sandbox Code Playgroud)
ContentPresenter不起作用(按钮为空),单击该按钮时,IsChecked属性不会切换.此外,当IsChecked为真时,我不知道如何使按钮看起来被推.
.net ×6
wpf ×3
c++ ×2
.net-2.0 ×1
.net-3.5 ×1
android ×1
button ×1
c# ×1
checkbox ×1
coordinates ×1
debugging ×1
dictionary ×1
function ×1
key ×1
lower-bound ×1
multi-select ×1
mvvm ×1
profiler ×1
signalr ×1
signalr-hub ×1
size ×1
visible ×1
winforms ×1