我发现人们声称使用类中的所有只读字段并不一定使该类的实例不可变,因为即使在初始化(构造)之后,仍有"方法"来更改只读字段值.
怎么样?有什么方法?
所以我的问题是我们什么时候才能在C#中真正拥有一个"真正的"不可变对象,我可以安全地在线程中使用它?
匿名类型也创建不可变对象吗?有人说LINQ在内部使用了不可变的对象.究竟怎么样?
我也在MSDN论坛上问过这个问题... http://social.msdn.microsoft.com/Forums/en/wpf/thread/4493988a-9bd8-48fe-aff0-348502136a80
我需要知道为什么微软建议WPF中BindingList没有正确支持...
BindingList在WPF 中没有用的是什么?我发现它非常实用.到目前为止,我个人没有发现BindingList任何较慢或内存负载较多.
另外WPF ItemsControls,ItemsTemplates,Styles,Hierarchies工作的伟大与BindingList太迟了.他们同样可以观察到.
作为一个自己的核心WPF开发者和ObservableCollection粉丝,我的信念被一个曾经完成的事情所震撼BindingList....
我为什么要使用ObservableCollectionBindingList?(保留INotifyPropertyChanged,它们都必须实现项目属性更改)
我已经完成了自定义图表控件,我想在光标后面绘制一个简单的交叉.该图表在Canvas上实现为PolyLine,我在Canvas的OnMouseMove事件中绘制两条线来改变它们的坐标.
The surprise was to found that the event get called only each 10 seconds or so event when the MainGUI thread is idle (the UI is completely responsive and if I pause the application the main thread is at the App mainForm.ShowDialog()).
Any idea on how to find why is this happening? I get the same performance using the OnMouseMove or the PreviewOnMouseMove.
EDIT: This is how I paint the cross (anyway if I put a breakpoint at …
所以我使用WPF 3.5和MVVM + DataTemplate方法在GUI上加载2个视图.我在内存分析中观察到,作为项目控件的项容器的一部分生成的项目被固定到内存中,即使在卸载视图后也不会获得GCed!
我刚刚运行测试,发现即使对于最简单的代码,它也是可重现的...你们可以自己检查一下.
XAML:
<Window x:Class="ContentControlVMTest.Window2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ContentControlVMTest"
Title="Window2" Height="300" Width="300">
<DockPanel LastChildFill="True">
<CheckBox Click="CheckBox_Click" Content="Test1?"
DockPanel.Dock="Top" Margin="5"/>
<ContentControl x:Name="contentControl">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:Test3}">
<TextBlock Text="{Binding C}" Margin="5"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Test1}">
<DockPanel LastChildFill="True" Margin="5">
<TextBlock Text="{Binding A}"
DockPanel.Dock="Top"
Margin="5"/>
<ListBox ItemsSource="{Binding Bs}"
DisplayMemberPath="B"
Margin="5"/>
</DockPanel>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</DockPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
代码背后:
public class Test3
{
public string C { get; set; }
}
public class Test2
{
public string B { get; set; }
}
public …Run Code Online (Sandbox Code Playgroud) MSDN说"获取或设置一个可用于存储有关此元素的自定义信息的任意对象值." 这意味着我可以在这个属性中存储我想要的任何东西.
但是如果你绑定到这个属性(类型为String的属性,其值为"XYZ")并在触发条件下使用它,它就不起作用!
<Trigger Property="Tag" Value="XYZ">
<Setter Property="Background" Value="Red" />
</Trigger>
Run Code Online (Sandbox Code Playgroud)
它不会将背景设置为红色.您可以尝试将myElement假设为TextBlock!为什么会这样?
好吧让我们面对它,在渲染和布局传递WPF UI将冻结....
有没有逃过这个?
有人谈过XAML序列化和Desrialization,但它真的有用吗?我所看到的只是一个瞬间失效和冻结窗口,用于反序列化的复杂UI.
我是否能够实现快速的UI加载?
PS我不是在谈论在后台线程和东西上加载视图数据.现在它通常是一个常态.但有没有(这应该是绝望的)方式不为复杂的UI生成一个挂起的窗口?复杂的意思是重型,深层次模板,非虚拟化面板等.
需要使用哪些实际场景隧道事件?
我知道一个模糊的答案可能是当我们想要处理引发事件的视觉/逻辑事件时使用它.但那只是理论.
在实践中,我为什么要举办活动?
隧道(和冒泡)也可以在逻辑树或可视树或两者中工作吗?
好的......标题是正确的......
我不想要从平面列表中的层次结构,但完全相反
我有Folder类,其中包含属性所包含的文件夹列表Children.所以这是一个典型的层次模型.
我现在想要将这个列表弄平...它将是一个预订遍历即
假设
A
- A.1
----- A.1.1
----- A.1.2
- A.2
----- A.2.1
- A.3
B
- B.1
- B.2
----- B.2.1
----- B.2.2
----------- B.2.2.1
----------- B.2.2.2
Run Code Online (Sandbox Code Playgroud)
从这个层次结构中,我期待的平面列表正好是它出现在上面的顺序!
如果LINQ不能这样做,那么XSLT可以将它变成一个xml元素列表吗?
什么是非托管堆?
我认为CLR管理的任何基于对象的内存都是托管堆,那么为什么我们要讨论一个非托管堆呢?
我有一个非常复杂的UI,具有不断变化的状态栏,具有多种类型的状态消息和具有复杂图表控件和加载的指示性地理地图的UI.
现在,这些小但复杂区域的数据上下文具有同样复杂的ViewModel,如StatusBarVM,ChartingVM,GeoMapVM等......它们实现了INotifyPropertyChanged和ObservableCollections.
计算我的更新我发现我有大约5000个UI项目(标签,进度条,图表数据点,bgcolorsbrushes等),它们以每秒1000个数据项更新的速度变化.
在WPF UI上实现批量数据更新的最佳方法是什么?
WPF的绑定模型是否能够进行如此大规模的更新?如果是这样的话?因为我认为在我的情况下它不是最佳的.我正在使用bgworker(for progressbars)并使用DIspatcher BeginInvoke ...但重点是,即使这样,更新也会挂起UI线程,因为调度程序消息排队等待完成.
我不能实现虚拟化,因为状态是实时的,我必须在我面前的UI上看到它们.我甚至不能错过它们几秒钟(例如常数变化的卫星的地理数据).
请帮助我确定一个正确的工具或某种方法来实现复杂但高响应的WPF UI.它是Dispatcher.PushFrame()吗?