【问题标题】:Setting Visibility="Collapsed" doesn't hide the Button. Update: Fixed by myself but I want to know the reason for the issue设置 Visibility="Collapsed" 不会隐藏按钮。更新:由我自己修复,但我想知道问题的原因
【发布时间】:2017-04-22 17:25:36
【问题描述】:

我正在创建自定义传输控件。在那,我添加了一个 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 部分中将Visibility="Collapsed" 设置为AppBarButton。我很惊讶,即使我设置了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. MediaPlayerDictionary.xaml - ResourceDictionary
  3. VideosPage.xaml - 我使用过这个CustomMediaTransportControls的页面的C#部分

【问题讨论】:

  • 在 XAML 中,您在某处使用',在其他地方使用"。为什么?试着让它"无处不在。
  • @MarianDolinský MediaPlayerElement 控件的默认样式和模板在 generic.xaml 中定义,使用的是',所以我遵循了这一点。我尝试使用",但没有任何区别。
  • 这很奇怪,在 XAML 中从未见过 '。顺便说一句,您的应用针对的是哪个版本的 W10?并且后面的代码不起作用,因为您使用以 c 开头的名称,但是在 XAML 中按钮的名称以 C 开头。
  • @MarianDolinský Min 版本 14393 - 目标版本 15063。我使用 var compactOverlayButton = GetTemplateChild("CompactOverlayButton") as Button; 创建按钮。我将在帖子中附上完整的代码。
  • 为什么这么难?当您在 XAML 中定义 x:Name="MyElementName" 时,您可以直接在像 MyElementName.Visibility = Visibility.Collapsed; 这样的代码中使用它。大多数情况下不需要GetTemplateChild

标签: c# xaml uwp win-universal-app windows-10-universal


【解决方案1】:

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

为可见性以及相应的侦听器添加一个属性:

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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 2019-06-28
    • 2021-07-06
    • 1970-01-01
    • 2023-03-08
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多