如何更改应用程序中每个控件的属性

时间:2010-11-23 14:36:59

标签: c# winforms controls properties

我想要做的是让用户能够更改我的应用程序中所有文本框的某些(此处)属性。当用户触发我的事件时,每个用户控件,面板等中的每个文本框都应该被更改。

例如,所有文本框都应该更改为Multiline=true;(我知道这没有多大意义,但我的需要与此非常相似),但如何实现这一点而不会遍历每个控件?

我知道我可以做类似

的事情
foreach(Control item in FindForm().Controls)
{
    if(item is TextBox)
    {
         (item as TextBox).Multiline=true;
    } 
}

但我不认为这是一个完美的解决方案。

我知道我可以将设置写入文件并在应用程序启动时读取它们,但是如何在运行应用程序时更改属性?

我的主要问题是ControlProperties不让我给他们一个布尔对象的引用,所以我不能轻易地在“设置对象”中更改它,或者我在这里想念一些东西?

3 个答案:

答案 0 :(得分:2)

我不知道有什么好的教程可以引导您完成它,但您可以对任何属性(包括Multiline)执行DataBinding,而不仅仅是文本。这应该做你需要做的事。

this.txtField.DataBindings.Add(
    new System.Windows.Forms.Binding("Multiline", 
         global::ProjectNamespace.Properties.Settings.Default, 
         "BoolianSettingInConfigFile", 
         true, 
         System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

我在这个例子中使用了配置文件,但它可以存储在任何地方。

答案 1 :(得分:0)

在这些情况下,您有两个基本选项:推送对控件的更改(如示例代码所做)或让控件本身从配置中提取数据

使用pull方法可以在运行时更新控件。 您可以在所有文本框上使用数据绑定将文本框的“多行”属性绑定到设置的某个中央存储。你可以更进一步,派生自定义文本框控件,在实例化时自动处理自己的数据绑定设置,所以一旦你用自己的文本框类型替换文本框(这实际上可以通过搜索和替换代码完成)你不必须进行更多的代码更改。

答案 2 :(得分:0)

也许您可以使用数据触发器和全局可访问的实用程序类:

这是一个例子,只需点击一个按钮,所有文本块都将有一个红色前景

<Window x:Class="RoomUnit.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:c="clr-namespace:RoomUnit" Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <c:Utility x:Key="utility" />
    <Style TargetType="TextBlock">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Source={StaticResource utility}, 
                    Path=IsRed}" Value="true">
                <Setter Property="Foreground" Value="Red" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBlock Text="TEST" />
    <Button Content="Make Red" Grid.Row="1" Click="MakeRed" />
</Grid>

继承实用工具类

public class Utility : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool isRed;
    public bool IsRed
    {
        get { return isRed; }
        set 
        { 
            isRed = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsRed"));
        }
    }
}

并且继承了我的按钮事件处理程序

private void MakeRed(object sender, RoutedEventArgs e)
{
    var u = (Utility) this.FindResource("utility");
    u.IsRed = true;
}