我正在自定义 UserControl 中的 MediaTransportControls。
但是在 ControlTemplate 中使用 TargetType="MediaTransportControls",
我无法 x:bind 或绑定代码隐藏中的数据。
在第 TextBlock Text="{x:Bind localTime, Mode=OneWay}" 行,x:Bind localTime 无法工作。出现错误“在‘MediaTransportControls’类型中找不到属性‘localTime’”
我认为 x:bind 只能找到 MediaTransportControls 中的属性。
如何 x:bind 在我的 UserControl 代码隐藏中查找属性?
这是我的用户控件xaml
<UserControl.Resources>
<Style x:Key="CustomMediaTransportControls" TargetType="MediaTransportControls">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="VerticalAlignment" Value="Bottom"/>
<Setter Property="IsEnabled" Value="True"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="MediaTransportControls">
<Grid>
<TextBlock Text="{x:Bind localTime, Mode=OneWay}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid>
<MediaPlayerElement x:Name="myMediaPlayerElement"
AutoPlay="False"
<MediaPlayerElement.TransportControls>
<MediaTransportControls Style="{StaticResource CustomMediaTransportControls}"/>
</MediaPlayerElement.TransportControls>
</MediaPlayerElement>
</Grid>
这是我的 UserControl 代码隐藏
public sealed partial class MainMedia : UserControl
{
private string localTime = "My Local Time";
public MainMedia()
{
this.InitializeComponent();
}
}
建议在
UserContro
l中使用x:bind,但目前需要修改ControlTemplate
中的一个UserControl
并将其绑定到代码隐藏。在我的测试中,DependencyProperty
只能绑定一次。 MediaTransportControls
中显示的只是DependencyProperty
的默认值,无法更改,此行为类似于“mode=oneTime”。
这里有一个解决办法,在
UserControl
的ControlTemplate
上再添加一个MediaTransportControls
(UserTextControl),可以显示当前时间。
<UserControl.Resources>
<Style x:Key="CustomMediaTransportControls" TargetType="MediaTransportControls">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="VerticalAlignment" Value="Bottom"/>
<Setter Property="IsEnabled" Value="True"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="MediaTransportControls">
<StackPanel Background="White">
<local:UserTextControl/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid>
<MediaPlayerElement x:Name="myMediaPlayerElement"
AutoPlay="True" Source="ms-appx:///Assets/sample-5s.mp4" AreTransportControlsEnabled="True">
<MediaPlayerElement.TransportControls>
<MediaTransportControls Style="{StaticResource CustomMediaTransportControls}"/>
</MediaPlayerElement.TransportControls>
</MediaPlayerElement>
</Grid>
<Grid Background="White">
<TextBlock Text="{x:Bind localTime,Mode=OneWay}"/>
</Grid>
public sealed partial class UserTextControl : UserControl
{
DispatcherTimer Timer = new DispatcherTimer();
public UserTextControl()
{
this.InitializeComponent();
Timer.Tick += Timer_Tick;
Timer.Interval = new TimeSpan(0, 0, 1);
Timer.Start();
}
private void Timer_Tick(object sender, object e)
{
GeographicRegion userRegion = new GeographicRegion();
string regionCode = userRegion.CodeTwoLetter;
DateTimeFormatter timeFormatter = new DateTimeFormatter("year month day hour minute second", new[] { regionCode });
localTime = timeFormatter.Format(DateTime.Now);
}
public static readonly DependencyProperty localTimeProperty =
DependencyProperty.Register("localTime", typeof(string), typeof(UserTextControl), new PropertyMetadata("UserTextControl default string"));
public string localTime
{
get { return (string)GetValue(localTimeProperty); }
set { SetValue(localTimeProperty, value); }
}
}