Как изменить свойство каждого элемента управления в приложении - PullRequest
2 голосов
/ 23 ноября 2010

что я хочу сделать, это дать пользователю возможность изменить некоторые (здесь одно) свойства всех текстовых полей в моем приложении.Когда пользователь запускает мое событие, каждое текстовое поле в каждом пользовательском контроле, панели и т. Д. Должно быть изменено.

Например, все текстовые поля должны измениться на Multiline=true; (я знаю, что это не имеет особого смысла, номои потребности действительно похожи на это), но как этого добиться, не зацикливаясь на каждом элементе управления?

Я знаю, что могу сделать что-то вроде

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

, но я не думаю, что этоэто не идеальное и не хорошее решение.

Я знаю, что могу записать настройки в файл и прочитать их при запуске приложения, но как изменить свойства при запуске приложения?

Моя основная проблема в том, что ControlProperties не позволяют мне дать им ссылку на логический объект, поэтому я не могу легко изменить его в «объекте настроек», или я что-то здесь упускаю?

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

Я не знаю ни одного хорошего учебника, чтобы провести вас через него, но вы можете сделать привязку данных к любому свойству (включая Multiline), а не только к текстовому.Это должно сделать то, что вам нужно.

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

Я использовал файл конфигурации в этом примере, но его можно сохранить где угодно.

0 голосов
/ 23 ноября 2010

Может быть, вы могли бы просто использовать триггер данных и глобально доступный служебный класс:

Вот пример, где при нажатии кнопки все текстовые блоки будут иметь красный передний план

<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;
}
0 голосов
/ 23 ноября 2010

В этих обстоятельствах у вас есть два основных варианта: push изменения в элементе управления (как вы делаете пример кода) или сами элементы управления извлекают данные из конфигурации.

Использование подхода извлечения позволит вам обновлять элементы управления во время выполнения.Вы можете использовать привязку данных на всех ваших текстовых полях, чтобы привязать свойство «Многострочный» текстовых полей к некоторому центральному хранилищу настроек.Вы можете пойти дальше и получить пользовательские элементы управления текстовым полем, которые автоматически обрабатывают свои собственные настройки привязки данных при создании экземпляра, поэтому, если вы заменили текстовые поля своим собственным типом текстового поля (это можно сделать с помощью поиска и замены в коде), вы не сможетедолжны сделать больше изменений кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...