Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式更改WPF样式中的颜色--应用程序资源_C#_Wpf_Xaml - Fatal编程技术网

C# 以编程方式更改WPF样式中的颜色--应用程序资源

C# 以编程方式更改WPF样式中的颜色--应用程序资源,c#,wpf,xaml,C#,Wpf,Xaml,我简化了一些代码。样式的定义更符合我正在处理的实际程序中的定义,而不是原始示例的所有自动生成的绒毛-对于窗口资源示例和我尝试移动到应用程序资源示例的内容 我还“点划”了到appColors.appColor的绑定,该绑定基于应用程序资源示例中的DependencyObject。我也玩过一些w/INotifyPropertyChanged,但还没有让它正常工作。我在App和AppColors类中都尝试过这一点 基于,我能够使用转换器和DependencyProperty值以编程方式更改文本框的前景

我简化了一些代码。
样式
的定义更符合我正在处理的实际程序中的定义,而不是原始示例的所有自动生成的绒毛-对于窗口资源示例和我尝试移动到应用程序资源示例的内容

我还“点划”了到
appColors.appColor
的绑定,该绑定基于应用程序资源示例中的
DependencyObject
。我也玩过一些w/
INotifyPropertyChanged
,但还没有让它正常工作。我在
App
AppColors
类中都尝试过这一点

基于,我能够使用转换器和DependencyProperty值以编程方式更改文本框的前景色。使用本地Windows资源生成的代码如下所示:

MainWindow.xaml:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" x:Name="LocalWindow" x:Class="ColorLocal.MainWindow"
        xmlns:local="clr-namespace:ColorLocal"
        Title="MainWindow" Height="122.321" Width="269.87">
    <Window.Resources>
        <local:ColorToSolidColorBrushConverter x:Key="ColorToSolidColorBrushConverter" />
        <Style x:Key="LocalTextBoxStyle" BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
            <Setter Property="Foreground" Value="{Binding ElementName=LocalWindow, Path=localColor, Converter={StaticResource ColorToSolidColorBrushConverter}}"/>
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
        </Style>
    </Window.Resources>
    <Grid>
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" Style="{DynamicResource LocalTextBoxStyle}"/>
        <Button x:Name="btnRed" Content="Red" HorizontalAlignment="Left" Margin="10,47,0,0" VerticalAlignment="Top" Width="75" Click="btnRed_Click"/>
        <Button x:Name="btnGreen" Content="Green" HorizontalAlignment="Left" Margin="90,47,0,0" VerticalAlignment="Top" Width="75" Click="btnGreen_Click"/>
        <Button x:Name="btBlue" Content="Blue" HorizontalAlignment="Left" Margin="170,47,0,0" VerticalAlignment="Top" Width="75" Click="btBlue_Click"/>
        <Button x:Name="btnNewWindow" Content="New Window" HorizontalAlignment="Left" Margin="170,10,0,0" VerticalAlignment="Top" Width="75" Click="btnNewWindow_Click"/>

    </Grid>
</Window>

MainWindow.xaml.cs

namespace ColorLocal
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public static readonly DependencyProperty localColorProperty = DependencyProperty.Register("localColor", typeof(Color?), typeof(MainWindow), new PropertyMetadata(Colors.Purple));

        public Color? localColor
        {
            get { return (Color?)GetValue(localColorProperty); }
            set { SetValue(localColorProperty, value); }
        }

        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnRed_Click(object sender, RoutedEventArgs e)
        {
            this.localColor = Colors.Red;
        }

        private void btnGreen_Click(object sender, RoutedEventArgs e)
        {
            this.localColor = Colors.Green;
        }

        private void btBlue_Click(object sender, RoutedEventArgs e)
        {
            this.localColor = Colors.Blue;
        }

        private void btnNewWindow_Click(object sender, RoutedEventArgs e)
        {

        }
    }

    public class ColorToSolidColorBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Color? desiredColor = value as Color?;
            if (desiredColor != null)
            {
                return new SolidColorBrush(desiredColor.Value);
            }

            //Return here your default
            return DependencyProperty.UnsetValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return DependencyProperty.UnsetValue;
        }
    }
}
namespace ColorApp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnRed_Click(object sender, RoutedEventArgs e)
        {
            ((App)Application.Current).appColors.appColor = Colors.Red;
        }

        private void btnGreen_Click(object sender, RoutedEventArgs e)
        {
            ((App)Application.Current).appColors.appColor = Colors.Green;
        }

        private void btBlue_Click(object sender, RoutedEventArgs e)
        {
            ((App)Application.Current).appColors.appColor = Colors.Blue;
        }

        private void btnNewWindow_Click(object sender, RoutedEventArgs e)
        {

        }
    }
}
名称空间颜色局部
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
public static readonly dependencProperty localColorProperty=dependencProperty.Register(“localColor”、typeof(Color?)、typeof(main window)、newpropertyMetadata(Colors.Purple));
公共颜色?本地颜色
{
获取{return(Color?)GetValue(localColorProperty);}
set{SetValue(localColorProperty,value);}
}
公共主窗口()
{
初始化组件();
}
私有void btnRed\u单击(对象发送者,路由目标)
{
this.localColor=Colors.Red;
}
私有void btnGreen\u单击(对象发送者,路由目标e)
{
this.localColor=Colors.Green;
}
私有void btBlue_单击(对象发送者,路由目标e)
{
this.localColor=Colors.Blue;
}
私有无效BTNNEWINDOW\U单击(对象发送者,路由目标e)
{
}
}
公共类ColorToSolidColorBrushConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
颜色?所需颜色=作为颜色的值?;
如果(desiredColor!=null)
{
返回新的SolidColorBrush(desiredColor.Value);
}
//在这里返回默认值
返回dependencProperty.unset值;
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回dependencProperty.unset值;
}
}
}
此代码生成一个对话框,其中包含一个文本框,文本最初为紫色,三个按钮分别标记为红色绿色、&蓝色,另一个按钮标记为新建窗口。按相应的颜色按钮,更改文本框中文本的颜色。“新建窗口”按钮不起任何作用

我现在想知道如何将其移动到应用程序资源中,我可以将其分配给不同窗口上的所有控件,并在整个程序中进行颜色更改。我做了附加代码段中详细说明的更改。起初,我在App.xaml.cs代码中使用DependencyObject值时遇到问题,但后来发现另一篇关于这个问题的帖子。然而,即使在主窗口文本框上,文本框的前景色仍然是黑色的(我还没有编码新窗口按钮按下的逻辑)

如有任何想法/指导,将不胜感激

我已经更新了代码样本。提供的代码更符合代码的实际编码

App.xaml

<Application
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" x:Name="LocalApp" x:Class="ColorApp.App"
             xmlns:local="clr-namespace:ColorApp"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <local:ColorToSolidColorBrushConverter x:Key="ColorToSolidColorBrushConverter" />
        <Style x:Key="AppTextBoxStyle" TargetType="{x:Type TextBox}" BasedOn="{x:Null}">
            <Setter Property="Foreground" Value="{Binding appColors.appColor, Converter={StaticResource ColorToSolidColorBrushConverter}, ElementName=LocalApp}"/>
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
        </Style>
    </Application.Resources>
</Application>

App.xaml.cs

namespace ColorApp
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public AppColors appColors = new AppColors();
    }

    public class AppColors : DependencyObject
    {
        public static readonly DependencyProperty appColorProperty = DependencyProperty.Register("appColor",
                                typeof(Color?), typeof(AppColors), new PropertyMetadata(Colors.Purple));

        public Color? appColor
        {
            get { return (Color?)this.GetValue(appColorProperty); }
            set { this.SetValue(appColorProperty, value); }
        }
    }

    public class ColorToSolidColorBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Color? desiredColor = value as Color?;
            if (desiredColor != null)
            {
                return new SolidColorBrush(desiredColor.Value);
            }

            //Return here your default
            return DependencyProperty.UnsetValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return DependencyProperty.UnsetValue;
        }
    }
}
namespace ColorApp
{
/// 
///App.xaml的交互逻辑
/// 
公共部分类应用程序:应用程序
{
public AppColors AppColors=新的AppColors();
}
公共类AppColor:DependencyObject
{
公共静态只读DependencyProperty appColorProperty=DependencyProperty.Register(“appColor”,
typeof(Color?),typeof(AppColors),新属性ymatadata(Colors.Purple));
公共颜色?appColor
{
获取{return(Color?)this.GetValue(appColorProperty);}
set{this.SetValue(appColorProperty,value);}
}
}
公共类ColorToSolidColorBrushConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
颜色?所需颜色=作为颜色的值?;
如果(desiredColor!=null)
{
返回新的SolidColorBrush(desiredColor.Value);
}
//在这里返回默认值
返回dependencProperty.unset值;
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回dependencProperty.unset值;
}
}
}
MainWindow.xaml

<Window x:Class="ColorApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="122.321" Width="269.87">
    <Grid>
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" Style="{DynamicResource AppTextBoxStyle}"/>
        <Button x:Name="btnRed" Content="Red" HorizontalAlignment="Left" Margin="10,47,0,0" VerticalAlignment="Top" Width="75" Click="btnRed_Click"/>
        <Button x:Name="btnGreen" Content="Green" HorizontalAlignment="Left" Margin="90,47,0,0" VerticalAlignment="Top" Width="75" Click="btnGreen_Click"/>
        <Button x:Name="btBlue" Content="Blue" HorizontalAlignment="Left" Margin="170,47,0,0" VerticalAlignment="Top" Width="75" Click="btBlue_Click"/>
        <Button x:Name="btnNewWindow" Content="New Window" HorizontalAlignment="Left" Margin="170,10,0,0" VerticalAlignment="Top" Width="75" Click="btnNewWindow_Click"/>

    </Grid>
</Window>

MainWindow.xaml.cs

namespace ColorLocal
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public static readonly DependencyProperty localColorProperty = DependencyProperty.Register("localColor", typeof(Color?), typeof(MainWindow), new PropertyMetadata(Colors.Purple));

        public Color? localColor
        {
            get { return (Color?)GetValue(localColorProperty); }
            set { SetValue(localColorProperty, value); }
        }

        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnRed_Click(object sender, RoutedEventArgs e)
        {
            this.localColor = Colors.Red;
        }

        private void btnGreen_Click(object sender, RoutedEventArgs e)
        {
            this.localColor = Colors.Green;
        }

        private void btBlue_Click(object sender, RoutedEventArgs e)
        {
            this.localColor = Colors.Blue;
        }

        private void btnNewWindow_Click(object sender, RoutedEventArgs e)
        {

        }
    }

    public class ColorToSolidColorBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Color? desiredColor = value as Color?;
            if (desiredColor != null)
            {
                return new SolidColorBrush(desiredColor.Value);
            }

            //Return here your default
            return DependencyProperty.UnsetValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return DependencyProperty.UnsetValue;
        }
    }
}
namespace ColorApp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnRed_Click(object sender, RoutedEventArgs e)
        {
            ((App)Application.Current).appColors.appColor = Colors.Red;
        }

        private void btnGreen_Click(object sender, RoutedEventArgs e)
        {
            ((App)Application.Current).appColors.appColor = Colors.Green;
        }

        private void btBlue_Click(object sender, RoutedEventArgs e)
        {
            ((App)Application.Current).appColors.appColor = Colors.Blue;
        }

        private void btnNewWindow_Click(object sender, RoutedEventArgs e)
        {

        }
    }
}
namespace ColorApp
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有void btnRed\u单击(对象发送者,路由目标)
{
((App)Application.Current).appColors.appColor=Colors.Red;
}
私有void btnGreen\u单击(对象发送者,路由目标e)
{