从其他页面访问 App.xaml 中的控件
Accessing a control in App.xaml from other pages
因此,在我的 App.xaml(WP8 应用程序) 中,我有一个 MediaElement 控件。我已经成功 "looped it" 完成了我的 WP8 应用程序。 (是的,我知道我应该使用 XNA Framework 但仍然如此。)
我想通过其他应用程序页面访问它并更改控件的各种属性例如它的音量等
但是,我不确定如何访问它?!
如果您还可以解释 "FindName" 和 "FindResource" 术语之间的区别,那就更好了。
另一件让我感兴趣的事情是,假设我能够成功地 return 一个控件从一个特定的页面到另一个页面并将其存储在一个 say "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>
回答原问题:
您需要引用原始页面的实例,此时您可以在可视化树中搜索控件。更好的方法是将修改方法公开为该控件的 public 方法,然后这些方法将通过控件名称设置它:
public SetVideoVolume(int level)
{
MediaPlayer.Volume = level;
}
如果您确实持有对该控件的引用,是的,更改会影响它(毕竟您只是持有一个引用)。
FindName
查找 FrameworkElement
(通常是控件),而 FindResource
在 Resources
部分查找内容。
但是
None那是真的有必要。您 应该 做的是将所有这些元素(如 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 有效设计的,因此它们已经内置了一大堆东西。
好的,这完全不是必需的,但对我有用,也应该对其他人有用。
方法改变:-
我没有在 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 中的 controls/variables,这显然是全局的。
例如:-
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();
}
因此,在我的 App.xaml(WP8 应用程序) 中,我有一个 MediaElement 控件。我已经成功 "looped it" 完成了我的 WP8 应用程序。 (是的,我知道我应该使用 XNA Framework 但仍然如此。)
我想通过其他应用程序页面访问它并更改控件的各种属性例如它的音量等
但是,我不确定如何访问它?! 如果您还可以解释 "FindName" 和 "FindResource" 术语之间的区别,那就更好了。
另一件让我感兴趣的事情是,假设我能够成功地 return 一个控件从一个特定的页面到另一个页面并将其存储在一个 say "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>
回答原问题:
您需要引用原始页面的实例,此时您可以在可视化树中搜索控件。更好的方法是将修改方法公开为该控件的 public 方法,然后这些方法将通过控件名称设置它:
public SetVideoVolume(int level)
{
MediaPlayer.Volume = level;
}
如果您确实持有对该控件的引用,是的,更改会影响它(毕竟您只是持有一个引用)。
FindName
查找 FrameworkElement
(通常是控件),而 FindResource
在 Resources
部分查找内容。
但是
None那是真的有必要。您 应该 做的是将所有这些元素(如 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 有效设计的,因此它们已经内置了一大堆东西。
好的,这完全不是必需的,但对我有用,也应该对其他人有用。
方法改变:-
我没有在 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 中的 controls/variables,这显然是全局的。
例如:-
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();
}