如何 运行 Visiblity.Collapsed 上的 UWP FrameworkElement SizeChanged 方法?
How to run UWP FrameworkElement SizeChanged method on Visiblity.Collapsed?
我想在宽度>50 时显示 FrameworkElement,否则折叠它
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;
}
考虑到你的 progressBar 的 x:Name 是 PB_LocalDrive 那么你可以只做下面的事情,你不需要通过父级找到元素,即使元素被折叠,这也会起作用。
private void Parent_SizeChanged(object sender, SizeChangedEventArgs e)
{
PB_LocalDrive.Visibility = PB_LocalDrive.ActualWidth > 50 ? Visibility.Visible : Visibility.Collapsed;
}
这种做法可能会导致极其复杂的问题,需要强调这一点,因为其他两个用户没有注意到它。
永不 根据父元素的当前大小更改元素的可见性或其他布局状态。
这是因为可以创建无限 UI 循环,因为所述父控件的包含项可以以两种方式影响父控件,导致 SizeChanged 事件不断触发,这需要我举很多例子我可以很好地展示这一点,但我认为最好为您提供一系列针对您的特定问题的广泛使用和接受的解决方案。
首先,不要使用 FindName,如果您的控件上有名称,直接引用它即可,无需增加函数开销。
其次使用 AdaptiveTrigger,这是 xaml 第一种方法,比代码方法更干净、更漂亮,有关更多信息,请查看:
https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.AdaptiveTrigger
最后,如果您真的想坚持使用代码方法,请确保与更可靠且根据尺寸定义的东西进行比较,这是您应用程序的当前 window,它将永远不会溢出到可见的应用程序 space 之外,无论其内容内部发生什么,它都不会改变,它位于 Window.Current.Bounds
的一个不错的位置
我想在宽度>50 时显示 FrameworkElement,否则折叠它
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;
}
考虑到你的 progressBar 的 x:Name 是 PB_LocalDrive 那么你可以只做下面的事情,你不需要通过父级找到元素,即使元素被折叠,这也会起作用。
private void Parent_SizeChanged(object sender, SizeChangedEventArgs e)
{
PB_LocalDrive.Visibility = PB_LocalDrive.ActualWidth > 50 ? Visibility.Visible : Visibility.Collapsed;
}
这种做法可能会导致极其复杂的问题,需要强调这一点,因为其他两个用户没有注意到它。
永不 根据父元素的当前大小更改元素的可见性或其他布局状态。
这是因为可以创建无限 UI 循环,因为所述父控件的包含项可以以两种方式影响父控件,导致 SizeChanged 事件不断触发,这需要我举很多例子我可以很好地展示这一点,但我认为最好为您提供一系列针对您的特定问题的广泛使用和接受的解决方案。
首先,不要使用 FindName,如果您的控件上有名称,直接引用它即可,无需增加函数开销。
其次使用 AdaptiveTrigger,这是 xaml 第一种方法,比代码方法更干净、更漂亮,有关更多信息,请查看: https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.AdaptiveTrigger
最后,如果您真的想坚持使用代码方法,请确保与更可靠且根据尺寸定义的东西进行比较,这是您应用程序的当前 window,它将永远不会溢出到可见的应用程序 space 之外,无论其内容内部发生什么,它都不会改变,它位于 Window.Current.Bounds