设置 Visibility="Collapsed" 不会隐藏按钮。更新:由我自己修复,但我想知道问题的原因

Setting Visibility="Collapsed" doesn't hide the Button. Update: Fixed by myself but I want to know the reason for the issue

我正在创建自定义传输控件。在那里,我添加了一个 AppBarButton。为了改变它的可见性,我为它创建了一个 属性,但由于某种原因,它不起作用。 AppBarButton 始终可见。

代码属性

//To change Visibility for CompactOverlayButton
public bool IsCompactOverlayButtonVisible
{
    get
    {
        return compactOverlayButton != null && compactOverlayButton.Visibility == Visibility.Visible;
    }
    set
    {
        if (compactOverlayButton != null)       //To neglect the Visibility check before the Template has been applied
        {
            compactOverlayButton.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
        }
    }
}

所以我开始调试它。我在 C# 部分找不到任何错误,所以我在 XAML 部分为 AppBarButton 设置了 Visibility="Collapsed"。我很惊讶,即使我设置了 Visibility="Collapsed"AppBarButton 仍然可见。

这是我在 XAML 部分的代码

<AppBarButton x:Name='CompactOverlayButton'
    Style='{StaticResource AppBarButtonStyle}'
    MediaTransportControlsHelper.DropoutOrder='17' Visibility="Collapsed">
    <AppBarButton.Icon>
        <FontIcon Glyph="&#xEE40;"/>
    </AppBarButton.Icon>
</AppBarButton>

更新:

我找到了导致它的代码行。它来自我使用此 CustomMediaTransportControls.

的页面的 C# 部分

导致此问题的行是

var youtubeUrl = await YouTube.GetVideoUriAsync("QTYVJhy04rs", YouTubeQuality.Quality144P, videoQuality);

我已经通过在上面的代码行之后设置 CustomMediaControl.IsCompactOverlayButtonVisible = false; 来解决这个问题。尽管如此,我还是想知道上面这行是如何影响我的程序的。完整代码已包含在参考部分

供参考:

这是我的全部代码

  1. CustomMediaTransportControls.cs - 从 MediaTransportControls
  2. 派生 class
  3. MediaPlayerDictionary.xaml - ResourceDictionary
  4. VideosPage.xaml - 我使用此 CustomMediaTransportControls
  5. 的页面的 C# 部分

我不确定删除这一行是否解决了问题,因为我在没有这行代码的情况下遇到了同样的问题。但是我找到了解决这个问题的方法:

为可见性和相应的侦听器添加 属性:

public Visibility CompactOverlayButtonVisibility
{
    get { return (Visibility)GetValue(CompactOverlayButtonVisibilityProperty); }
    set { SetValue(CompactOverlayButtonVisibilityProperty, value); }
}

public static readonly DependencyProperty CompactOverlayButtonVisibilityProperty =
    DependencyProperty.Register(nameof(CompactOverlayButtonVisibility) , typeof(Visibility), typeof(CustomMediaTransportControls), new PropertyMetadata(Visibility.Visible, OnVisibisityChanged));


internal static void OnVisibisityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){
    if (((CustomMediaTransportControls)d).compactOverlayButton != null)
    {
        if ((Visibility)e.NewValue != Visibility.Visible)
            ((CustomMediaTransportControls)d).commandBar.PrimaryCommands.Remove(((CustomMediaTransportControls)d).compactOverlayButton);
        else if (!((CustomMediaTransportControls)d).commandBar.PrimaryCommands.Contains(((CustomMediaTransportControls)d).compactOverlayButton))
            ((CustomMediaTransportControls)d).commandBar.PrimaryCommands.Insert(4, ((CustomMediaTransportControls)d).compactOverlayButton);
        ((CustomMediaTransportControls)d).compactOverlayButton.Visibility = Visibility.Visible;
    }

并将以下内容添加到您的 OnApplyTemplateMethod 中:

commandBar = GetTemplateChild("MediaControlsCommandBar") as CommandBar;
        compactOverlayButton = GetTemplateChild("CompactOverlayButton") as AppBarButton;
if (CompactOverlayButtonVisibility != Visibility.Visible)
    commandBar.PrimaryCommands.Remove(compactOverlayButton);
else if(!commandBar.PrimaryCommands.Contains(compactOverlayButton))
    commandBar.PrimaryCommands.Insert(4, compactOverlayButton);
compactOverlayButton.Visibility = Visibility.Visible;

但是,尽管在 xaml 代码中设置了可见性,但您可能想调查为什么代码更改了可见性。也许这对所有 AppBarButtons 都是正确的,也许不是。您可以尝试一下,然后查看相关的源代码 here。如果找到原因,您可能会找到更好的解决方案。