【发布时间】:2019-07-21 07:44:20
【问题描述】:
我需要隐藏一个 TextBlock,它是 Border 的子级并被添加到 Grid 中。以下代码将 Border 和 TextBlock 动态添加到 Grid。然后,如果 Grid 包含超过 5 个孩子,它会隐藏第一个孩子。它可以正常隐藏边框,但 TextBlock(Border 的子项)仍然可见。
知道问题出在哪里吗?谢谢!
Border TextBorder = new Border();
TextBorder.BorderBrush = new SolidColorBrush(_settings.TextColor);
TextBorder.BorderThickness = new Thickness(0,0,0,2);
TextBorder.Padding = new Thickness(0, 10, 0, 10);
RowDefinition rd = new RowDefinition();
rd.Height = GridLength.Auto;
myGrid.RowDefinitions.Add(rd);
TextBlock uc = new TextBlock();
uc.Text = "Test";
TextBorder.Child = uc;
Grid.SetRow(TextBorder, myGrid.RowDefinitions.Count -1);
myGrid.Children.Add(TextBorder);
if (myGrid.Children.Count > 5)
{
Border border = (Border)myGrid.Children[myGrid.Children.Count - 6];
border.Visibility = Visibility.Hidden;
border.Child.Visibility = Visibility.Hidden;
}
更新
代码正常工作。问题出在 TextBlock 的 OnRender 事件中,该事件以某种图形效果绘制文本。我虽然如果控件不可见 OnRender 不应该被提升,但它接缝它也会在控件不可见时被提升。我还没有找到阻止 OnRender 被提升的方法,也没有找到 ClipToBound 或 Invisible 工作。所以我放弃了这种方法,如果 TextBlock 在容器的可见区域中,我只检查 OnRender。
【问题讨论】:
-
不是一个真正的澄清请求,但无论如何:为什么在 WPF 中使用代码?为什么不是 XAML?
-
border.Child.Visibility = Visibility.Hidden;为什么不使用 uc.Visibility = Visibility.Hidden;
-
@dymanoid 我不明白你的问题。此代码在 C# 中用于 WPF 应用程序。我需要动态执行此操作,因此无法在 XAML 代码中执行此操作。
-
@DenisSchaf 因为我需要隐藏第一个 TextBlocks 而不是当前添加的
-
您可以在 XAML 中动态地做所有事情,只需使用样式和模板机制。但这确实与您的问题无关。
标签: c# wpf border visibility textblock