【问题标题】:How to run UWP FrameworkElement SizeChanged method on Visiblity.Collapsed?如何在 Visiblity.Collapsed 上运行 UWP FrameworkElement SizeChanged 方法?
【发布时间】:2018-09-24 09:36:32
【问题描述】:

我想在宽度>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;
}

【问题讨论】:

    标签: c# uwp frameworkelement


    【解决方案1】:

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

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

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

    首先,不要使用FindName,如果你的控件上有名字就直接引用它,不需要增加函数的开销。

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

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

    的一个不错的位置

    【讨论】:

    • AdaptiveTrigger 正是我所需要的。谢谢
    • 我使用 FindName 的目的只是访问 DataTemplate 内部的元素。例如 DataTemplate>Grid>TextBlock x:Name="TXT_Name" 如果我​​想在 Grid_PointerEntered TXT_Name 上隐藏 TXT_Name,则不能通过名称直接访问。 FindName 对于这种状态是否正确?
    • 点得好,本来打算推荐视觉状态,但我想我直接回答了这个问题。
    【解决方案2】:

    考虑到你的progressBar的x:Name是PB_LocalDrive,那么你可以只做下面的事情,你不需要通过父元素找到元素,即使元素折叠也可以。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多