這個問題在這里已經有了答案: 如何在設定屬性后僅進行一次 UserControl 初始化 (1 個回答) 8 小時前關閉。
我目前正在創建一個 WPF 應用程式,我注意到一些奇怪的事情。通過屬性將資料傳遞到 UserControl 似乎有延遲。
public partial class TestControl : UserControl
{
public string Subject { get; set; } = "Foo";
public TestControl()
{
InitializeComponent();
DataContext = this;
Start();
}
public async Task Start()
{
Debug.WriteLine("Subject is: " Subject);
await Task.Delay(1);
Debug.WriteLine("Subject is: " Subject);
}
}
在主視窗中,我設定了 UserControl 的主題屬性:
<Window x:Class="TestApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestApplication"
xmlns:views="clr-namespace:TestApplication.Views"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<views:TestControl Subject="Bar"></views:TestControl>
</Grid>
</Window>
在輸出中,我得到了列印出的默認值 Foo,然后 1 毫秒后我得到了 Bar。
Subject is: Foo
Subject is: Bar
有沒有辦法保證使用傳入的值而不是默認值初始化組件,而不用人為地增加一些延遲使其作業?
uj5u.com熱心網友回復:
沒有延遲。
您正在Start從 的建構式呼叫,TestControl并且由于它是一個async Task函式,因此一旦遇到await.
然后,WPF 可以繼續使用其配置資料填充控制元件 - 因此設定Subject為Bar.
與此同時,await Task.Delay(1)完成,您現在列印 的新值Bar。
實際上,您是通過在物件構造期間呼叫即發即用方法來創建感知的計時問題。
uj5u.com熱心網友回復:
將 Start() 附加到 Usercontrol 的 SizeChanged 怎么樣
public partial class TestControl : UserControl
{
public string Subject { get; set; } = "Foo";
public TestControl()
{
InitializeComponent();
DataContext = this;
(YourUserControl).SizeChanged = (o,e) =>
{
if((YourUserControl).ActualHeight > 0 && (YourUserControl).ActualWidth > 0 )
Start();
};
}
public async Task Start()
{
Debug.WriteLine("Subject is: " Subject);
await Task.Delay(1);
Debug.WriteLine("Subject is: " Subject);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/360010.html
上一篇:橢圓WPF中的文本框
