3

我有一个应用程序范围的标志,它是一个应用程序设置。

MyApp.Properties.Settings.Default.SoundMuted

标志是我的应用程序声音是否静音。我有许多通过.Net 的声音播放器播放声音的窗口。我在想标志将被连接到带有命令的工具栏按钮。我正在考虑静音通知让我的类播放声线到一个类(例如SoundManager)挂在实现的应用程序上NotifyPropertyChange。然后,如果用户单击工具栏按钮,我会在我的设置中设置静音属性,SoundManager并让所有声音播放器类都获得PropertyChange静音。

有没有更好的模式呢?假设我可以将所有声音播放器连接到命令并且该命令会触发。

还有一些巧妙的方法可以将该应用程序设置连接为xaml中的可绑定属性吗?

4

2 回答 2

0

一种方法是创建一个包装类来提供对 static 的可绑定访问Settings.Default

从那以后我意识到这比需要的工作更多,请参阅我的其他答案

namespace MyApp
{
    internal sealed class ResourceWrapper
    {
        public Settings Default
        {
            get
            {
                return Settings.Default;
            }
        }
    }
}

现在,我们需要将它作为资源添加到某处,可以在 App.xaml 中完成,这里我已经在使用它的窗口本地完成,不要忘记命名空间:

xmlns:local="clr-namespace:MyApp"

<Window.Resources>
    <local:ResourceWrapper x:Key="SettingsWrapper"/>
</Window.Resources>

现在我们需要绑定到它,这表明它在MenuItem同一个窗口中使用:

<Menu>
    <MenuItem Header="Audio">
        <MenuItem Header="Mute" IsCheckable="True"
          IsChecked="{Binding Path=Default.SoundMuted, Source={StaticResource ResourceKey=SettingsWrapper}}"/>
    </MenuItem>
</Menu>

就像我说的,您可以在应用程序级别添加资源,或者您可以在不同的窗口/控件中创建多个这些 ResourceWrapper,它们都将指向相同的静态底层。

带有测试的完整 xaml 窗口TextBlock

<Window x:Class="Test_WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyApp"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:ResourceWrapper x:Key="SettingsWrapper"/>
    </Window.Resources>
    <Grid>
        <Menu>
            <MenuItem Header="Audio">
                <MenuItem Header="Mute" IsCheckable="True" IsChecked="{Binding Path=Default.SoundMuted, Source={StaticResource ResourceKey=SettingsWrapper}}"/>
            </MenuItem>
        </Menu>
        <TextBlock Text="{Binding Path=Default.SoundMuted, Source={StaticResource ResourceKey=SettingsWrapper}}" Height="23" HorizontalAlignment="Left" Margin="18,156,0,0" VerticalAlignment="Top" Width="75" />
    </Grid>
</Window>
于 2012-11-04T12:17:41.847 回答
0

尽管我总是采用与其他答案相同的方法来敲击该示例,但我已经意识到这是不合理的。您可以直接绑定到Settings对象,如下所示:

<Window x:Class="Test_WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyApp"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:Settings x:Key="SettingsRes"/>
    </Window.Resources>
    <Grid>
        <Menu>
            <MenuItem Header="Audio">
                <MenuItem Header="Mute" IsCheckable="True"
                   IsChecked="{Binding Path=Default.SoundMuted, Source={StaticResource ResourceKey=SettingsRes}}"/>
            </MenuItem>
        </Menu>
        <TextBlock Text="{Binding Path=Default.SoundMuted, Source={StaticResource ResourceKey=SettingsRes}}" Height="23" HorizontalAlignment="Left" Margin="18,156,0,0" VerticalAlignment="Top" Width="75" />
    </Grid>
</Window>

同样,该资源的多个实例仍然可以很好地协同工作,例如将 绑定TextBlock到第二个资源:

<Window x:Class="Test_WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyApp"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:Settings x:Key="SettingsRes"/>
        <local:Settings x:Key="SettingsRes2"/>
    </Window.Resources>
    <Grid>
        <Menu>
            <MenuItem Header="Audio">
                <MenuItem Header="Mute" IsCheckable="True" IsChecked="{Binding Path=Default.SoundMuted, Source={StaticResource ResourceKey=SettingsRes}}"/>
            </MenuItem>
        </Menu>
        <TextBlock Text="{Binding Path=Default.SoundMuted, Source={StaticResource ResourceKey=SettingsRes2}}" Height="23" HorizontalAlignment="Left" Margin="18,156,0,0" VerticalAlignment="Top" Width="75" />
    </Grid>
</Window>
于 2012-11-04T12:27:11.497 回答