gpt4 book ai didi

c# - WPF 实际宽度为零

转载 作者:太空狗 更新时间:2023-10-29 22:28:41 24 4
gpt4 key购买 nike

我有一个用户控件,它有一个高度为 100、宽度为 1920 的 Canvas

在加载控件时,我转到外部源,下载文本文件并将 TextBlock 添加到 Canvas。然后我想创建一个选框滚动效果,它应该可以正常工作,除了在我将 TextBlock 添加到 Canvas 之后,我需要获取它们的宽度以用于计算目的但是ActualWidth 属性始终为零。

这是一些代码:

private readonly LinkedList<TextBlock> textBlocks = new LinkedList<TextBlock>();

public LocalNewsControl()
{
Loaded += LocalNewsControlLoaded;
}

private void LocalNewsControlLoaded(object sender, RoutedEventArgs e)
{
LoadDataContext();
}

private void LoadDataContext()
{
DataContext = new NewsItemsViewModel((exception) => LoadNewsItems());
}

private void LoadNewsItems()
{
var viewModel = (NewsItemsViewModel)DataContext;

NewsCanvas.Children.Clear();
textBlocks.Clear();

foreach (var newsViewModel in viewModel.NewsItems)
{
var tb = new TextBlock
{
Text = newsViewModel.Headline,
FontSize = 28,
FontWeight = FontWeights.Normal,
Foreground = Brushes.Black
};

NewsCanvas.Children.Add(tb);

Canvas.SetTop(tb, 20);
Canvas.SetLeft(tb, -999);

textBlocks.AddLast(tb);
}

Dispatcher.BeginInvoke(new Action(() =>
{
var node = textBlocks.First;

while (node != null)
{
if (node.Previous != null)
{
//THIS IS WHERE ActualWidth is always ZERO
var left = Canvas.GetLeft(node.Previous.Value) + node.Previous.Value.ActualWidth + Gap;
Canvas.SetLeft(node.Value, left);
}
else
Canvas.SetLeft(node.Value, NewsCanvas.Width + Gap);

node = node.Next;
}
}));
}

最佳答案

您始终可以将委托(delegate)附加到 PropertyMetatdata/OnValueChanged,当 ActualHeight/ActualWidth 从 0 变为某个值时,调整滚动,ActualWidth/ActualHeight 至少渲染一次后会有一个值:

LocalNewsControl()
{
var descriptor = DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, typeof(TextBlock));
if (descriptor != null)
descriptor.AddValueChanged(myTextBlock, ActualWidth_ValueChanged);
}

private void ActualWidth_ValueChanged(object a_sender, EventArgs a_e)
{
//Modify you scroll things here
...
}

关于c# - WPF 实际宽度为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4498397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com