2010-11-23 53 views
2

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

例如,所有的文本框应改为Multiline=true;(我知道这没有多大意义,但我的需求与此非常相似),但是如何在不循环每个控件的情况下实现此目的?

我知道我可以做这样的事情

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

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

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

我的主要问题知道是ControlProperties不让我给他们一个布尔对象的引用,所以我不能轻易地在“设置对象”中更改它,或者我在这里错过了什么?

回答

2

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

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

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

+0

我今天试试这个,我是古玩,如果这对我的作品:) – basti 2010-11-24 08:22:07

+0

这就是做我想做的,不是那么容易和简单的写,我想,但它确实是什么应该 - 谢谢你! – basti 2010-11-24 09:26:26

0

在这种情况下有两种基本选择:的变化给控制(如你示例代码),或具有本身从配置拉数据的控件。

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

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")); 
     } 
    } 
} 

and heres my b utton事件处理

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