1

私は WPF アプリケーションで作業しており、実行時に色を変更しようとしています。私はこのスレッドに投稿された解決策を試しました: WPF: 実行時に App.xaml からリソース (色) を変更します。ただし、解決策はうまくいかないようです。

3 つのリソース ディクショナリが定義されています

Colors1.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Color x:Key="BaseColor">#ffaa01</Color>
  <SolidColorBrush x:Key="BackgroundColorBrush" Color="{DynamicResource BaseColor}" />
</ResourceDictionary>

Colors2.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Color x:Key="BaseColor">#aaff01</Color>
<SolidColorBrush x:Key="BackgroundColorBrush" Color="{DynamicResource BaseColor}" />
</ResourceDictionary>

Colors3.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Color x:Key="BaseColor">#aa01ff</Color>
<SolidColorBrush x:Key="BackgroundColorBrush" Color="{DynamicResource BaseColor}" />
</ResourceDictionary>

3 つのリソース ディクショナリはすべて、「Resources」というアプリケーションのルート内のサブ フォルダにあります。

Colors1 リソース ディクショナリを Application リソース (Application.xaml ファイル内) に追加して、既定で読み込まれるようにしました。

ここに私の Application.xaml があります:

<Application x:Class="Application"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
   <Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary x:Name="Colors1" Source="Resources/Colors1.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
   </Application.Resources>
</Application>

アプリケーションに「Window1」という名前のウィンドウがあり、リソース ディクショナリを切り替えることができるグリッドとコンボ ボックスが含まれています。

Window1 の xaml コードは次のとおりです。

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Picture Orders" Height="600" Width="600"
xmlns:myProj="clr-namespace:TryingWPF">
<Window.Resources>
    <x:Array x:Key="ResourceNames" Type="sys:String"
             xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <sys:String>Colors1</sys:String>
        <sys:String>Colors2</sys:String>
        <sys:String>Colors3</sys:String>
    </x:Array>
</Window.Resources>
<Grid x:Name="VisualRoot" Background="{DynamicResource BackgroundColorBrush}">
    <ComboBox x:Name="ResourceOptions" 
              ItemsSource="{StaticResource ResourceNames}" 
              SelectedIndex="0"
              VerticalAlignment="Top"
              HorizontalAlignment="Center"
              SelectionChanged="ResourceOptions_SelectionChanged"/>
</Grid>
</Window>

ウィンドウ内のグリッドの背景色を変更する ComboBox の Selection Changed イベントを処理する VB.NET コードを次に示します。

Public Class Window1

   Private Sub ResourceOptions_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs)
    Dim resourceSource As String = String.Format("pack://application:,,,/Resources/{0}.xaml", ResourceOptions.SelectedValue)
    Dim newResourceDictionary As New ResourceDictionary()
    newResourceDictionary.Source = New Uri(resourceSource)
    Application.Current.Resources.MergedDictionaries.RemoveAt(0)
    Application.Current.Resources.MergedDictionaries.Insert(0, newResourceDictionary)

   End Sub
End Class

何が間違っているのかわかりません。

色を変更するにはどうすればよいですか?

*編集: * この質問を投稿した直後に、ブラシをカラー リソース ファイルからウィンドウ リソースに移動すると、リソースを切り替えると色が変わることがわかりました。

ただし、ブラシを ColorBrushes と呼ばれる別の ResourceDictionary に移動し、単純に Color ResourceDictionaries を切り替えると、色は変わりません。

私のメイン アプリケーションでは、すべてのブラシは、ウィンドウやユーザー コントロール自体ではなく、ResourceDictionaries で定義されています。これはまだ問題です。

4

1 に答える 1

2

Colors ディクショナリを変更してから、Brushes ディクショナリを Brushes ディクショナリに変更することで問題を解決しました。

そのようです:

Public Class Window1

 Private Sub ResourceOptions_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs)
   Dim resourceSource As String = String.Format("pack://application:,,,/Resources/{0}.xaml", ResourceOptions.SelectedValue)
   Dim newResourceDictionary As New ResourceDictionary()
   newResourceDictionary.Source = New Uri(resourceSource)
   Application.Current.Resources.MergedDictionaries.RemoveAt(0)
   Application.Current.Resources.MergedDictionaries.Insert(0, newResourceDictionary)

   Dim brushesResourceSource As String = "pack://application:,,,/Resources/ColorBrushes.xaml"
   Dim newBrushesResourceDictionary As New ResourceDictionary()
   newBrushesResourceDictionary.Source = New Uri(brushesResourceSource)
   Application.Current.Resources.MergedDictionaries.RemoveAt(1)
   Application.Current.Resources.MergedDictionaries.Insert(1, brushesResourceSource)
 End Sub
End Class

-フリニー

于 2012-11-19T15:02:35.363 に答える