【问题标题】:Accessing a control in App.xaml from other pages从其他页面访问 App.xaml 中的控件
【发布时间】:2015-01-13 17:08:06
【问题描述】:

所以,在我的 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>

【问题讨论】:

  • 我很确定 WP8 不支持 XNA,你知道的。那是 WP7 的事情。
  • 我在我的 WP8 应用程序中使用了 SoundEffect 类。此外,还有这个link 你可能想看看。
  • 我(几乎)得到纠正。有有限支持。请参阅msdn.microsoft.com/en-us/library/windows/apps/…(注意,尽可能考虑链接到实际文档而不是随机教程/博客,它更可靠/官方)

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


【解决方案1】:

回答原来的问题:

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

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

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

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

然而

这些都不是真正必要的。您应该做的是将所有这些元素(例如 Volume 绑定到您的视图模型中的属性。然后您将让您的其他页面(通过定位器或其他模式)设置 绑定值。此更改将通过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 应用商店问题提供更好的解决方案。更好的是,WPF/XAML 框架是为 MVVM 设计的,所以它们已经内置了一大堆东西。

【讨论】:

  • 你在这里试图传达的概念对我来说有点清楚。但是,我无法找出我应该通过它访问控件的“定位器或其他模式”。如果您能以某种代码形式向我提供信息,那就太好了。
  • @AnmolKumar 我使用“Mediator”添加了一个示例当然还有很多其他方法。
  • 感谢您的帮助,尽管我尝试了自己的一些方法....现在似乎可以工作了!干杯。
【解决方案2】:

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

方法的改变:-

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

最后,在 Application_Startup(object sender, 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();
    }

【讨论】:

  • 我很高兴你明白了,但如果你问我,那是一个非常丑陋的设计
  • 呵呵,我同意,但我发现它很容易实现。
  • 记住:易于实现!=易于维护/扩展/重用。最简单的设计是将所有内容都放在 main 中,但这并不是一个好主意
  • 同意,但在某些场景下为了使系统“易于维护/扩展/重用”,我们倾向于使其难以实现!一个活生生的例子是 DBMS 中的规范化过程。因此,我们同意引入去规范化的概念,从而接受数据库中的冗余。
  • 我 99% 确信关系数据库的非规范化不是易于实现,而是查询速度。针对非规范化数据库运行的查询快得多。而现实情况是,在你知道什么时候应该去规范化之前,它应该被规范化,至少到第一个范式,如果不是第二个的话。再三考虑,100% 确定:msdn.microsoft.com/en-us/library/cc505841.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2018-12-15
  • 2012-09-06
  • 2018-12-16
  • 2014-05-20
相关资源
最近更新 更多