WPF 边框子可见性无效

Posted

技术标签:

【中文标题】WPF 边框子可见性无效【英文标题】:WPF Border Child visibility have no effect 【发布时间】: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 中动态地做所有事情,只需使用样式和模板机制。但这确实与您的问题无关。 【参考方案1】:

首先,我认为你做的是你不应该做的事! 但是你可以这样做(顺便说一句,这假设你只将边框添加到你的网格中):

if (myGrid.Children.Count > 5)

   (myGrid.Children[myGrid.Children.Count - 6] as Border).Visibility = Visibility.Hidden;

我还建议删除不要隐藏孩子,否则它将毫无意义地继续存在

myGrid.Children.Remove(myGrid.Children[0]);

【讨论】:

这等同于:Borderborder = (Border)myGrid.Children[myGrid.Children.Count - 6];边界.可见性=可见性.隐藏;问题是它只使 Border 而不是 TextBlock 子项不可见。你能解释一下为什么你认为这是我不应该做的事情吗?您对如何实现 seme 结果有更好的想法吗? 如您在我的编辑中看到的,删除它们而不是仅仅隐藏它们 我猜你刚刚开始使用 WPF,所以我猜为什么这不是一个好主意的解释会超出这个问题的范围但是你基本上在这里做的是一个列表视图,所以为什么不使用列表视图? 不,我长期使用 WPF。不,我不能使用列表视图,因为整个项目更复杂,它使用带有动画效果的 ScrollView 和更多超出此问题范围的内容来解释。但是这里的问题是为什么边界的孩子不会变得不可见。 而不是添加边框并向其添加文本块,而是创建一个具有您想要的外观的自定义控件,并将此自定义控件添加到您的网格中。顺便说一句,孩子总是从父母那里继承你的文本框,如果你所做的事情没有其他问题,你也应该隐藏你的文本框,你可以使用可视化树来跟踪你的问题

以上是关于WPF 边框子可见性无效的主要内容,如果未能解决你的问题,请参考以下文章

WPF 绑定不更新可见性

WPF 可见性折叠保留空间

WPF XAML 网格可见性触发器

WPF:可见性绑定,事件 = null

WPF 动画窗口可见性更改

如何使用 WPF 中的代码绑定 DataGridTextColumn 的可见性属性?