Как запустить метод UWP FrameworkElement SizeChanged для Visiblity.Collapsed? - PullRequest
0 голосов
/ 24 сентября 2018

Я хочу показать FrameworkElement, когда его ширина> 50, иначе свернуть его

private void PB_LocalDrive_SizeChanged(object sender, SizeChangedEventArgs e)
{
    var progressBar = sender as FrameworkElement;
    progressBar.Visibility = progressBar.ActualWidth > 50 ? Visibility.Visible : Visibility.Collapsed;
}

, но это работает только тогда, когда он видим (а не свернут).Как я могу запустить этот метод, даже если он свернулся?

Я также пытался получить доступ к нему от его родителя, но результат тот же.Элемент недоступен после свернутого

private void Parent_SizeChanged(object sender, SizeChangedEventArgs e)
{
    var stackPanel = sender as FrameworkElement;
    var progressBar = (ProgressBar)stackPanel.FindName("PB_LocalDrive");
    progressBar.Visibility = progressBar.ActualWidth > 50 ? Visibility.Visible : Visibility.Collapsed;
}

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

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

Никогда не изменяет видимость или другие состояния макетаэлемент, основанный на его родительском Current Size.

Это связано с тем, что бесконечный цикл пользовательского интерфейса может быть создан, так как содержащиеся элементы указанного родительского элемента управления могут воздействовать на родителя двояким образом, вызывая постоянное срабатывание события SizeChanged,Мне нужно много примеров, чтобы продемонстрировать это красиво, но я думаю, что лучше представить вам кучу широко используемых и принятых решений для вашей конкретной проблемы.

Прежде всего, не используйте FindName,если у вас есть имя в вашем элементе управления, просто ссылайтесь на него, нет необходимости в дополнительных издержках функции.

Во-вторых, используйте AdaptiveTrigger, это первый подход xaml, который чище и приятнее, чем подход кода, для получения дополнительной информации проверьте это: https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.AdaptiveTrigger

Наконец,если вы действительно хотите придерживаться подхода к коду, то обязательно сравните его с чем-то более твердым и определенным в терминах размеров, и это текущее окно вашего приложения, оно никогда не будет переполнено за пределами видимого пространства приложения и никогда не будетизменить независимо от того, что происходит внутри его содержимого, он находится в хорошем месте на Window.Current.Bounds

0 голосов
/ 24 сентября 2018

Учитывая, что x: Name вашего progressBar равно PB_LocalDrive , тогда вы можете просто сделать следующее, и вам не нужно находить элемент через родительский элемент, это будет работать, даже если элемент свернут.

private void Parent_SizeChanged(object sender, SizeChangedEventArgs e)
{
    PB_LocalDrive.Visibility = PB_LocalDrive.ActualWidth > 50 ? Visibility.Visible : Visibility.Collapsed;
}
...