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

时间:2015-01-13 17:08:06

标签: c# wpf xaml windows-phone-8 xna

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

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

但是,我不确定如何访问它?! 如果您还可以解释“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>

2 个答案:

答案 0 :(得分:0)

回答原来的问题:

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

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

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

FindName查找FrameworkElement(通常是一个控件),FindResource查找Resources部分中的内容。

然而

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

例如,您可以使用Mediator执行此操作:

//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 Store问题提供更好的解决方案。更好的是,WPF / XAML框架是为MVVM有效设计的,因此它们已经内置了大量内容。

答案 1 :(得分:0)

好吧,这不是所需要的,但对我有用,也应该为其他人做。

方法改变: -

我没有在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();
    }