ich ein Benutzersteuer haben, die eine Canvas
der Höhe hat 100 und Breite 1920.WPF Actual Null
Bei der Belastung der Steuer, ich auf eine externe Quelle gehen, laden Sie eine Textdatei und fügen Sie TextBlock
s die Leinwand. Dann möchte ich einen Laufschrift Scroll-Effekt erstellen, der gut funktionieren sollte, außer nachdem ich die TextBlock
s zu der Canvas
s hinzufügen, muss ich ihre Breite für Berechnungszwecke erhalten, aber die ActualWidth
Eigenschaft ist immer Null. Hier
ist ein Code:
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;
}
}));
}
TextBlock- nicht sichtbar ist und ist nicht geladen, also hat es keine Eigenschaft ActualWidth. Ich habe ein ähnliches Problem mit Itemscontrol gelöst, aber ich bin mir nicht sicher über Canvas. Probieren Sie Ereignisse wie LayoutUpdated, SizeChanged usw. aus. – vorrtex