我试图找到将数字 (0..9) 转换为 Kotlin 中相应字符 '0'..'9' 的最简单方法。
我最初的尝试是编写以下代码:
fun convertToCharacter() {
val number = 0
val character = number.toChar()
println(character)
}
Run Code Online (Sandbox Code Playgroud)
当然,运行后,我很快发现这会产生 \u0000,而不是我预期的“0”。然后,记住如何在 Java 中执行此操作,我修改了代码以添加“0”,但这样就无法编译。
fun convertToCharacter() {
val number = 0
val character = number.toChar() + '0'
println(character)
}
Run Code Online (Sandbox Code Playgroud)
在 Kotlin 中将数字转换为其相应字符的正确方法是什么?理想情况下,我试图避免拉出 ASCII 表来完成此操作(我知道我可以将 48 添加到数字中,因为 ASCII 中的 48 -> '0')。
最初的问题是不知道为什么PropertyChangedCallback
不触发,它是由某些代码输入错误(对于SO而言太本地化)引起的。但是,我已经修改了问题,以解决在添加/删除了子项目或子项目的属性已更改时如何重新呈现自定义控件的问题。 请访问我的答案以深入了解如何触发重新渲染。
我要编写的自定义控件具有以下结构:
MyControl : FrameworkElement
MyControl.Items
MyItem : FrameworkContentElement
MyItem.SubItems
MySubItem : FrameworkContentElement
MySubItem
MyItem
MyItem
因此,基本上,我的控件有一个DependencyProperty
存储的ObservableCollection<MyItem>
。它DependencyProperty
具有一个PropertyChangedCallback
用于检测集合设置/取消设置的时间。此回调函数用于预订CollectionChanged
事件,以便在MyItem
从集合中添加/删除a时可以引起控件的重新呈现。
当集合项的属性发生更改时,我的控件也应重新呈现。因此,MyItem
也实现INotifyPropertyChanged
,并且我PropertyChangedEventHandler
在将MyItem
对象添加/删除到集合时进行订阅。
到目前为止,一切都很好...
的MyItem
类定义了几个DependencyProperies
,其中的每一个具有相同的PropertyChangedCallback
功能。 但令我惊讶的是,当我修改MyItem
XAML 中的属性之一时,不会触发此回调函数。
我希望学习的是为什么发生这种情况以及为什么PropertyChangedCallback
不触发这种情况。另外,我想知道什么情况会导致回调触发。
我的目标是拥有一个在以下情况下重新渲染的控件:
a)更改其属性
b)添加/删除
其子级c)更改其子级的属性
d)添加/删除其子级的孩子e)更改
其子级的孩子的属性改变了。
这是我注册MyControl.Items
财产的方式。这DependencyProperty
可以成功触发属性更改事件。
public static readonly …
Run Code Online (Sandbox Code Playgroud) 首先,这个问题有相关帖子: 为什么Int32最大值是0x7FFFFFFF?
但是,我想知道为什么十六进制值始终被视为无符号数量.
请参阅以下代码段:
byte a = 0xFF; //No error (byte is an unsigned type).
short b = 0xFFFF; //Error! (even though both types are 16 bits).
int c = 0xFFFFFFFF; //Error! (even though both types are 32 bits).
long d = 0xFFFFFFFFFFFFFFFF; //Error! (even though both types are 64 bits).
Run Code Online (Sandbox Code Playgroud)
出错的原因是因为十六进制值始终被视为无符号值,无论它们存储的数据类型如何.因此,对于所描述的数据类型,该值"太大".
int c = 0xFFFFFFFF;
Run Code Online (Sandbox Code Playgroud)
存储值:
-1
Run Code Online (Sandbox Code Playgroud)
而不是价值:
4294967295
Run Code Online (Sandbox Code Playgroud)
仅仅因为int
是签名类型.
我怎么能存储这些位转换成这些数据类型,而不诉诸使用ushort
,uint
和ulong
?
特别是,long
考虑到我不能使用更大的签名数据类型,我怎样才能实现数据类型?
首先,我在SO和网络上看到了很多类似的问题.这些似乎都没有解决我的特定问题.
我有一个简单BackgroundWorker
的工作是逐行读取文件并报告进度以指示它有多远.文件中总共有65,553行,因此BackgroundWorker
尽可能快地完成对我来说很重要.
由于MVVM建立在关注点分离(SoC)和视图和视图模型的分离之上BackgroundWorker
,因此View绑定的View-Model上的更新属性.我的设置与Kent Boorgaart在另一个问题上的答案非常相似.
在BackgroundWorker
需要大量CPU而不会休眠的高压力情况下,UI线程缺乏并且无法更新已通过通知的任何绑定属性INotifyPropertyChanged
.但是,如果BackgroundWorker
睡觉,那么工作将无法尽快完成.
在View-Model中,这样BackgroundWorker
设置.该Start()
函数由RelayCommand
(MVVM-Light的一部分)调用.
public void Start(string memoryFile)
{
this.memoryFile = memoryFile;
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += Worker_DoWork;
worker.ProgressChanged += Worker_ProgressChanged;
worker.WorkerReportsProgress = true;
worker.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
以下是执行的实际工作的代码:
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = (BackgroundWorker)sender;
IsAnalyzing = true;
bw.ReportProgress(0, new ProgressState("Processing..."));
int count = File.ReadLines(memoryFile).Count();
StreamReader …
Run Code Online (Sandbox Code Playgroud)