从其他页面访问 App.xaml 中的控件

本文关键字:xaml 控件 App 访问 其他 | 更新日期: 2023-09-27 18:37:19

所以,在我的App.xaml(WP8 App)中,我有一个MediaElement控件。我已经成功地通过我的WP8应用程序"循环"了它(是的,我知道我应该使用XNA框架,但仍然如此。

我想通过其他应用程序页面访问它并更改控件的各种属性,例如它的音量等。

但是,我不确定如何访问它?!如果您还可以解释"FindName"和"FindResource"术语之间的区别,那就更好了。

感兴趣的另一件事是,假设我能够成功地将控件从特定页面返回到另一个页面并将其存储在"Temp_Control"中(显然与检索到的控件的类型匹配),我对"Temp_Control"所做的任何更改是否也会反映在原始控件中?如果没有,那么我该如何实现设置它?!

提前非常感谢。

我在 App.xaml 中使用的代码是:-

    <!--Application Resources-->
    <Application.Resources>
    <local:LocalizedStrings xmlns:local="clr-namespace:PQRS"          x:Key="LocalizedStrings"/>
    <Style  x:Key="RootFrameStyle" TargetType="phone:PhoneApplicationFrame">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="phone:PhoneApplicationFrame">
                    <Grid>
                        <MediaElement x:Name="MediaPlayer" Source="/abcd.mp3" Volume="1" AutoPlay="True" MediaEnded="MediaPlayer_MediaEnded"/>
                        <ContentPresenter />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Application.Resources>

从其他页面访问 App.xaml 中的控件

要回答原始问题:

您需要对原始页实例的引用,此时可以在可视化树中搜索控件。更好的方法是仅将修改方法公开为该控件的公共方法,然后这些方法将通过控件名称对其进行设置:

public SetVideoVolume(int level)
{
   MediaPlayer.Volume = level;
}

如果您确实持有对该控件的引用,是的,更改会影响它(毕竟您只是持有引用)。

FindName查找FrameworkElement(通常是控件),而FindResourceResources部分中查找某些内容。

然而

这些都不是真的必要。您应该做的是将所有这些元素(如Volume)绑定到视图模型中的属性。然后,您将让其他页面(通过定位器或其他模式)设置绑定值。此更改将通过INotifyPropertyChanged传播到控件,并且您永远不必弄乱实际控件

例如,您可以使用调解器并执行以下操作:

//Settings code:
MediaMediator.UpdateVolume(10);
//Mediator
public static event Action<int> VolumeUpdated;
public static void UpdateVolume(int level)
{
    //Please do the handler/null check, not here for brevity
    UpdateVolume(level);
}
//ViewModel
public int CurrentVolume {get; set;} //Actually using INotifyPropertyChanged of course
MediaMediator.VolumeUpdated += (l => CurrentVolume = l);
//View
<MediaElement ... Volume="{Binding CurrentVolume}"/>

这样做,从而遵循 MVVM,通常会为 WPF/Windows 应用商店问题提供更好的解决方案。更好的是,WPF/XAML 框架实际上是为 MVVM 设计的,因此他们已经内置了一大堆东西。

好吧,这完全不是必需的,但对我有用,也应该对其他人起作用。

方法的改变:-

我没有在 App.xaml 中设置控件,而是在 App.xaml.cs 中设置了它们。

最后,在Application_Startup(对象发送器,StartupEventArgs e)事件中,我通过以下方式将其添加到应用程序资源中

      Application.Current.Resources.Add(key,value);

如何通过其他页面访问添加的控件:-

基本上需要的是一行甜蜜的简单代码:

    var obj = App.Current as App;

使用"obj",您可以访问App.xaml中的控件/变量,这些控件/变量显然是全局的。

例如:-

    var obj = App.Current as App;
    obj.Control_Name.Control_Properties=//whatever you require

所以整体代码是这样的:-

    //In App.xaml.cs
    public MediaElement m = new MediaElement();
     private void Application_Startup(object sender, StartupEventArgs e)
    {
        //Set the properties of the MediaElement Control here
        Application.Current.Resources.Add("1", m); //Add it to the Application Resources

    }        

    //In MainPage.xaml.cs say for a Button Click Event
private void Button_Click(object sender, RoutedEventArgs e)
    {
        var obj = App.Current as App;
        obj.m.Play();
    }