设置 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=""/>
</AppBarButton.Icon>
</AppBarButton>
更新:
我找到了导致它的代码行。它来自我使用此 CustomMediaTransportControls
.
的页面的 C# 部分
导致此问题的行是
var youtubeUrl = await YouTube.GetVideoUriAsync("QTYVJhy04rs", YouTubeQuality.Quality144P, videoQuality);
我已经通过在上面的代码行之后设置 CustomMediaControl.IsCompactOverlayButtonVisible = false;
来解决这个问题。尽管如此,我还是想知道上面这行是如何影响我的程序的。完整代码已包含在参考部分
供参考:
这是我的全部代码
- CustomMediaTransportControls.cs - 从
MediaTransportControls
派生 class
- MediaPlayerDictionary.xaml -
ResourceDictionary
- VideosPage.xaml - 我使用此
CustomMediaTransportControls
的页面的 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。如果找到原因,您可能会找到更好的解决方案。
我正在创建自定义传输控件。在那里,我添加了一个 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=""/>
</AppBarButton.Icon>
</AppBarButton>
更新:
我找到了导致它的代码行。它来自我使用此 CustomMediaTransportControls
.
导致此问题的行是
var youtubeUrl = await YouTube.GetVideoUriAsync("QTYVJhy04rs", YouTubeQuality.Quality144P, videoQuality);
我已经通过在上面的代码行之后设置 CustomMediaControl.IsCompactOverlayButtonVisible = false;
来解决这个问题。尽管如此,我还是想知道上面这行是如何影响我的程序的。完整代码已包含在参考部分
供参考:
这是我的全部代码
- CustomMediaTransportControls.cs - 从
MediaTransportControls
派生 class
- MediaPlayerDictionary.xaml -
ResourceDictionary
- VideosPage.xaml - 我使用此
CustomMediaTransportControls
的页面的 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。如果找到原因,您可能会找到更好的解决方案。