小编Nic*_*ler的帖子

Kotlin中如何将数字转换为字符?

我试图找到将数字 (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')。

kotlin

3
推荐指数
1
解决办法
2986
查看次数

当子控件及其属性更改时,如何重新呈现自定义控件?

最初的问题是不知道为什么PropertyChangedCallback不触发,它是由某些代码输入错误(对于SO而言太本地化)引起的。但是,我已经修改了问题,以解决在添加/删除了子项目或子项目的属性已更改时如何重新呈现自定义控件的问题。 访问我的答案以深入了解如何触发重新渲染。


标题可能不是对问题的最好描述,但是无论如何,问题本身都不是很清楚。我认为发布此问题可能会有一定用处,因为PropertyChangedCallback触发得非常难以预测。

我要编写的自定义控件具有以下结构:

  • 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功能。 但令我惊讶的是,当我修改MyItemXAML 中的属性之一时,不会触发此回调函数。

我希望学习的是为什么发生这种情况以及为什么PropertyChangedCallback不触发这种情况。另外,我想知道什么情况会导致回调触发。

我的目标是拥有一个在以下情况下重新渲染的控件:
a)更改其属性
b)添加/删除
其子级c)更改其子级的属性
d)添加/删除其子级的孩子e)更改
其子级的孩子的属性改变了。


代码样例

这是我注册MyControl.Items财产的方式。这DependencyProperty可以成功触发属性更改事件。

public static readonly …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml dependency-properties wpf-controls

2
推荐指数
1
解决办法
1398
查看次数

无法将32位十六进制值分配给整数

首先,这个问题有相关帖子: 为什么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,uintulong

特别是,long考虑到我不能使用更大的签名数据类型,我怎样才能实现数据类型?

c# hex unsigned signed types

1
推荐指数
1
解决办法
379
查看次数

在MVVM中,如何防止BackgroundWorker冻结UI?

首先,我在SO和网络上看到了很多类似的问题.这些似乎都没有解决我的特定问题.

我有一个简单BackgroundWorker的工作是逐行读取文件并报告进度以指示它有多远.文件中总共有65,553行,因此BackgroundWorker尽可能快地完成对我来说很重要.

由于MVVM建立在关注点分离(SoC)和视图和视图模型的分离之上BackgroundWorker,因此View绑定的View-Model上的更新属性.我的设置与Kent Boorgaart在另一个问题上的答案非常相似.

BackgroundWorker需要大量CPU而不会休眠的高压力情况下,UI线程缺乏并且无法更新已通过通知的任何绑定属性INotifyPropertyChanged.但是,如果BackgroundWorker睡觉,那么工作将无法尽快完成.

如何在尊重MVVM的同时确保View接收进度更新,同时不限制作业?

在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)

c# data-binding wpf mvvm backgroundworker

0
推荐指数
1
解决办法
1362
查看次数