UWP 无法 x:bind MediaTransportControls 的 ControlTemplate 中的数据

问题描述 投票:0回答:1

我正在自定义 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();
    }
}
c# uwp uwp-xaml
1个回答
0
投票

建议在

UserContro
l中使用x:bind,但目前需要修改
ControlTemplate
中的一个
UserControl
并将其绑定到代码隐藏。在我的测试中,
DependencyProperty
只能绑定一次。
MediaTransportControls
中显示的只是
DependencyProperty
的默认值,无法更改,此行为类似于“mode=oneTime”。

这里有一个解决办法,在

UserControl
ControlTemplate
上再添加一个
MediaTransportControls
(UserTextControl),可以显示当前时间。

MyUserControl1.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">
                    <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>

用户文本控件.xaml

<Grid Background="White">
    <TextBlock Text="{x:Bind localTime,Mode=OneWay}"/>
</Grid>

UserTextControl.xaml.cs

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); }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.