3

アプリの設定であるアプリケーション全体のフラグがあります。

MyApp.Properties.Settings.Default.SoundMuted

フラグは、アプリのサウンドがミュートされているかどうかです。.Netのサウンドプレーヤーを介してサウンドが再生されるウィンドウがいくつかあります。旗はコマンド付きのツールバーボタンに接続されると思っていました。SoundManagerサウンドを再生するクラスを、を実装するアプリにぶら下がっているクラス(例)に接続するように通知をミュートすることを考えていましたNotifyPropertyChange。次に、ユーザーがツールバーボタンをクリックすると、自分SoundManagerでMutedプロパティを設定し、すべてのサウンドプレーヤークラスにPropertyChangeとミュートを取得させます。

これにはもっと良いパターンがありますか?すべてのサウンドプレーヤーをコマンドに接続すると、そのコマンドが起動するとします。

また、そのアプリの設定をxamlのバインド可能なプロパティとして配線するための巧妙な方法はありますか?

4

2 に答える 2

0

1つの方法は、静的へのバインド可能なアクセスを提供するラッパークラスを作成すること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>

私が言ったように、アプリレベルでリソースを追加することも、異なるウィンドウ/コントロールでこれらのResourceWrappersを複数作成することもできます。これらはすべて、同じ静的な基盤を指します。

テスト付きのウィンドウの完全な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を2番目のリソースにバインドします。

<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 に答える