WPF Border Child видимость не имеет никакого эффекта - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужно скрыть TextBlock, который является дочерним для Border и добавлен в Grid.Следующий код динамически добавляет Border и TextBlock в 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;
}

Обновление

Код работает правильно.Проблема была в событии OnRender TextBlock, который рисует текст с некоторым графическим эффектом.Я думаю, что если элемент управления невидим, OnRender не следует поднимать, но он показывает, что он также поднимается, когда элемент управления невидим.Я не нашел способа предотвратить поднятие OnRender, ни ClipToBound, ни Invisible.Поэтому я отказываюсь от этого подхода и просто проверяю в OnRender, находится ли TextBlock в видимой области контейнера.

1 Ответ

0 голосов
/ 27 февраля 2019

во-первых, я думаю, что вы делаете то, что вы не должны делать!Но вот как вы можете это сделать (кстати, это предполагает, что вы добавляете только границы в вашу сетку):

if (myGrid.Children.Count > 5)
{
   (myGrid.Children[myGrid.Children.Count - 6] as Border).Visibility = Visibility.Hidden;
}

также я рекомендую удалить, чтобы не скрывать ребенка, так как в противном случае он останется в существовании без какой-либо точки.

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