2014-01-23 2 views
0

Интересно, как я могу создавать кнопки в моем Toolbar, читая строки из TXT-файла. Например:Как создать несколько кнопок из существующих строк в .txt-файле

//bookmarks.txt 

http://example.com 
http://example2.com 
http://example3.com 
... 

То, что я хочу, чтобы моя программа на старте должна создать кнопку для каждой строки в моем .txt с этим событием:

public void Button_Click(object sender, RoutedEventArgs e) //fire bookmark event 
{ 
    string text = e.Source.ToString().Replace("System.Windows.Controls.Button: ", ""); 
    WebBrowser1.Navigate(text); 

} 

UPDATE

Это как я читаю .txt:

for (int i = 0; i < File.ReadLines(@"bookmarks.txt").Count(); i++) 
{ 
     //Add button right here 
} 
+2

Вы спрашиваете, как читать текстовый файл, а ваш образец кода - обработчик события для кнопки. Укажите код, который читает файл. –

+0

Да, я хочу, чтобы созданные кнопки использовали этот обработчик событий. Я обновил код, который читал файл. – proah

+0

@MarioStoilov Обновлено еще раз с моим прогрессом. – proah

ответ

1

Вы пытаетесь использовать WPF, как если бы это были WinForms. Это, как вы бы выполнить ваши требования в WPF ... сначала создать DependencyProperty коллекцию в вашем Window коде позади и заполнить его с текстовыми записями:

public static DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection<string>), typeof(YourWindowOrUserControl)); 

public ObservableCollection<string> Items 
{ 
    get { return (ObservableCollection<string>)GetValue(ItemsProperty); } 
    set { SetValue(ItemsProperty, value); } 
} 

... 

Items = new ObservableCollection<string>(File.ReadLines(@"bookmarks.txt")); 

Тогда вы просто данные связать коллекцию ToolBar.ItemsSource собственности и объявить DataTemplate, чтобы определить, что каждый string должен выглядеть ... в вашем случае, мы установим его как текст в Button:

<ToolBar ItemsSource="{Binding Items}"> 
    <ToolBar.ItemTemplate> 
     <DataTemplate> 
      <Button Content="{Binding}" Margin="1,0,0,0" /> 
     </DataTemplate> 
    </ToolBar.ItemTemplate> 
</ToolBar> 

конечно, вам нужно установить Window.DataContext к класс с вашим pr Свойства ... самый простой способ, чтобы установить его в коде позади конструктора, как это:

public YourWindowOrUserControl 
{ 
    InitializeComponent(); 
    DataContext = this; 
} 

Вам сусло прочитать о том, как установить DataContext правильно, хотя, как установить его так легко, но не обязательно правильно.

Наконец, вы можете создать класс со всеми необходимыми свойствами для Button ... Например, можно добавить свойство с именем Text, а другой называется Command, а затем сделать ваше Items свойство коллекция из них. Тогда вы можете привязать данные к этому следующим образом:

<ToolBar ItemsSource="{Binding Items}"> 
    <ToolBar.ItemTemplate> 
     <DataTemplate> 
      <Button Content="{Binding Text}" Command="{Binding Command}" Margin="1,0,0,0" /> 
     </DataTemplate> 
    </ToolBar.ItemTemplate> 
</ToolBar> 
+0

Очень хороший ответ. Большое спасибо. – proah

0

Вы можете создавать кнопки динамична и добавить кнопку события на лету:

Button btn = new Button(); 
btn.Location = new Point(yourX, yourY); 
btn.Font = new Font(btn.Font.Name, 10); 
btn.Text = "Text from your txt file here"; 
btn.ForeColor = Color.SeaShell; // choose color 
btn.AutoSize = true; 
btn.Click += (sender, eventArgs) => 
       { 
        string text = btn.Text.Replace("System.Windows.Controls.Button: ", ""); 
        WebBrowser1.Navigate(text); 
       }; 

(Вставьте этот код в For. Btw, вы можете заменить это пока. см. this ссылка)

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