我想要做的是让用户能够更改我的应用程序中所有文本框的某些(此处)属性。当用户触发我的事件时,每个用户控件,面板等中的每个文本框都应该被更改。
例如,所有文本框都应该更改为Multiline=true;
(我知道这没有多大意义,但我的需要与此非常相似),但如何实现这一点而不会遍历每个控件?
我知道我可以做类似
的事情foreach(Control item in FindForm().Controls)
{
if(item is TextBox)
{
(item as TextBox).Multiline=true;
}
}
但我不认为这是一个完美的解决方案。
我知道我可以将设置写入文件并在应用程序启动时读取它们,但是如何在运行应用程序时更改属性?
我的主要问题是ControlProperties不让我给他们一个布尔对象的引用,所以我不能轻易地在“设置对象”中更改它,或者我在这里想念一些东西?
答案 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;
}