如何在Visiblity.Collapsed上运行UWP FrameworkElement SizeChanged方法?

时间:2018-09-24 09:36:32

标签: c# uwp frameworkelement

我想在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 :(得分:1)

这种做法可能会导致非常复杂的问题,由于其他两个用户没有注意到它,因此需要强调这一点。

从不根据元素的父级“当前大小”更改其可见性或其他布局状态。

这是因为可以创建无限的UI循环,因为所述Parent控件的包含项可以以两种方式影响父类,从而导致SizeChanged事件不断触发,因此我需要大量示例来很好地展示这一点但是我认为最好为您提供针对您的特定问题的一堆被广泛使用和接受的解决方案。

首先,不要使用FindName,如果您在控件上有一个名称只是直接引用它,则不需要该函数的额外开销。

其次使用AdaptiveTrigger,它是xaml的第一种方法,比代码方法更干净,更漂亮,有关更多信息,请查看以下内容: https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.AdaptiveTrigger

最后,如果您真的想坚持使用代码方法,那么请确保与更大的实体进行比较,并根据大小进行定义,这是您应用程序的“当前”窗口,它将永远不会溢出到可见的应用程序之外空间,无论其内容发生什么变化,它都永远不会改变,它位于Window.Current.Bounds

的合适位置

答案 1 :(得分:0)

考虑到progressBar的x:Name是 PB_LocalDrive ,那么您可以执行以下操作,而无需通过父级查找元素,即使该元素折叠也可以使用。 / p>

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