2015-04-21 2 views
0

В моем приложении я хочу реализовать диалоговое окно параметров, как у вас в VisualStudios, если вы перейдете в Инструменты-> Параметры в строке меню. Как я могу это сделать? Моя первая идея заключалась в использовании страниц и навигации, но, возможно, есть более простой подход?Внедрение диалогового окна параметров

+0

Поскольку вы используете WPF, используете ли вы какие-либо подходы MVVM для создания своего приложения? –

+0

Да, я использую шаблон mvvm. – ooorndtski

ответ

0

Это, вероятно, не Простой способ, но я написал этот фрагмент, который соответствует вашей цели, и это хорошее упражнение.

В пустом проекте Windows Forms добавьте ListBox (listBox1) и панель (панель1). Затем создайте 2 UserControls (UserControl1 и UserControl2), это будет содержимое, отображаемое при нажатии на список.

В классе Form1 мы создаем ListItem класс, который будет содержать параметры меню, как например:

public partial class Form1 : Form 
{ 
    public class ListItem 
    { 
     public string Text { get; set; } 
     public UserControl Value { get; set; } 

     public ListItem(string text, UserControl value) 
     { 
      Text = text; 
      Value = value; 
     } 
    }; 

    ... 

} 

После этого вы добавляете элементы в ListBox сразу после InitializeComponent() в Form1:

public Form1() 
{ 
    InitializeComponent(); 

    listBox1.DisplayMember = "Text"; 
    listBox1.ValueMember = "Value"; 
    listBox1.Items.Add(new ListItem("Item1", new UserControl1())); 
    listBox1.Items.Add(new ListItem("Item2", new UserControl2())); 
} 

Это сделает так, что при использовании listBox1.SelectedItem он вернет объект, который вы можете применить к ListItem, и получить доступ к связанному с ним UserControl.

Чтобы использовать это поведение, перейдите к designmode и дважды щелкните ListBox, это добавит код для события SelectedIndexChanged. Мы используем это событие для отображения UserControl в панели panel1. Это приведет к удалению старого содержимого панели и добавить выбранный UserControl:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    panel1.Controls.Clear(); 
    UserControl control = (listBox1.SelectedItem as ListItem).Value; 
    if(control != null) 
    { 
     panel1.Controls.Add(control); 
     control.Dock = DockStyle.Fill; 
    } 
} 

Я предлагаю вам попробовать добавить кнопку или что-то дифференцировать UserControls и играть вокруг. Повеселись! :)

+0

. Тем временем я решил использовать tabControl. Но ваш подход звучит неплохо. Я буду помнить об этом. – ooorndtski

0

Вы должны создать новое окно и показать, что в отличие от создания страницы и перехода к ней. Затем вы должны позвонить .show() в новое окно, чтобы он показывал.

Тогда вы измените внешний вид нового окна, как хотите, так же, как и страницы редактирования.

Add New Item Window

0

Если вы строите ваши варианты в полной объектной модели, которая соответствует структуре окна настроек, то лучший способ заключается в использовании любой навигационной известно UI связывания, что ваш MVVM инструментарий использует. Окно параметров начнется как новое окно корневого уровня, к которому вы привязали бы корень вашей модели данных параметров.

Итак, коротко подумайте о диалоге параметров в виде мини-приложения, которое использует ту же структуру, что и ваше основное приложение MVVM, но с другим корнем модели данных.

Если вы планируете разрешить пользователю отменять изменения в параметрах, то вы хотите, чтобы модель данных параметров была клонируемой, чтобы вы могли заполнить окно параметров клоном, а затем поменять реальные параметры с помощью новые данные, если пользователь нажмет OK в окне параметров. Если они выбрали отмену, вы можете просто выбросить клонированный объект и уничтожить окно.

+0

Пользователь должен уметь исправлять изменения. Что вы подразумеваете под «... моделью данных [...] как представление в памяти ...»?Единственный способ, который я вижу, - глубоко скопировать всю модель данных, внести изменения и полностью скопировать ее обратно, если пользователь примет изменения. – ooorndtski

+0

Изменил формулировку этой заключительной части, чтобы более четко понять мой смысл. Другой путь был бы, если бы ваши параметры были постоянно сохранены каким-то образом, как в базе данных, и перечитывать по мере необходимости. –

+0

Если я реализую IClonable, я должен реализовать его в каждом настраиваемом типизированном объекте модели данных моих вариантов? Поскольку у меня есть много настраиваемых типизированных объектов и их коллекций в модели данных, есть ли простой способ клонировать всю модель данных? – ooorndtski

Смежные вопросы