Ошибка - уже определен член с именем "InitializeComponent" с такими же типами параметров.

Я попытался сделать из книги пример, который точно показывает

private Button button1;
public MainWindow()
{
    InitializeComponent();
}
private void InitializeComponent()
{
    // Configure the form.
    this.Width = this.Height = 285;
    this.Left = this.Top = 100;
    this.Title = "Code-Only Window";
    // Create a container to hold a button.
    DockPanel panel = new DockPanel();
    // Create the button.
    button1 = new Button();
    button1.Content = "Please click me.";
    button1.Margin = new Thickness(30);
    // Attach the event handler.
    button1.Click += button1_Click;
    // Place the button in the panel.
    IAddChild container = panel;
    container.AddChild(button1);
    // Place the panel in the form.
    container = this;
    container.AddChild(panel);
}

private void button1_Click(object sender, RoutedEventArgs e)
{
    button1.Content = "Thank you.";
}

Но это дает мне ошибку:

"Type 'WpfApplication1.MainWindow' already defines a member called 'InitializeComponent' with the same parameter types"


person Diaconescu Cristian    schedule 21.08.2014    source источник
comment
Я предполагаю, что вы скопировали InitializeComponent из другого источника в класс, когда этот метод уже существует (либо в том же файле, либо в другом файле, если он использует частичные классы).   -  person D Stanley    schedule 21.08.2014
comment
Прочтите ошибку. Прокомментируйте введенный метод InitializeComponent(), щелкните правой кнопкой мыши InitializeComponent() в конструкторе и выберите «Перейти к определению». Вы увидите, где он уже определен.   -  person CodeCaster    schedule 21.08.2014
comment
What is wrong with this example...? Немногое, кроме , это противоречит всем известным общепринятым передовым методам и шаблонам в WPF. WPF - это XAML и DataBinding, а не такой ужасный процедурный код, как этот. Этот пример показывает, чего НЕ следует делать в WPF.   -  person Federico Berasategui    schedule 21.08.2014
comment
stackoverflow.com/a/5021568/142904   -  person Kristian Damian    schedule 21.08.2014
comment
@HighCore в указанной книге есть примечание (Pro WPF: Windows Presentation Foundation, глава 2): Разработка только кода - менее распространенный [...] способ написания приложения WPF без XAML.   -  person CodeCaster    schedule 21.08.2014


Ответы (4)


Класс WPF Window, созданный в Visual Studio, обычно имеет метод InitializeComponent, который используется для инициализации его свойств и содержимого - Что делает InitializeComponent () и как он работает в WPF?.

Он создается из вашей разметки XAML и содержится не в CS-файле с выделенным кодом, а для компилятор (и msbuild.exe), это все еще действительная внутренняя часть класса Window - если вы создадите новое пустое окно и нажмете на вызов InitializeComponent(), тогда *.g.i.cs временный файл с кодом инициализации откроется.

Итак, когда вы помещаете другой InitializeComponent метод в код файла, это вызывает неоднозначное определение метода.


РЕШЕНИЕ:

Либо переименуйте свой собственный метод в InitializeComponentsCustom и вызовите его в конструкторе:

public MainWindow()
{
    InitializeComponent();

    InitializeComponentsCustom();
}

private void InitializeComponentsCustom()
{
    // ...
}

или просто поместите весь код из метода book в конструктор (только не удаляйте исходный вызов InitializeComponent).

person Eugene Podskal    schedule 21.08.2014
comment
Это очень информативно. У меня было много ошибок, которые уже были определены пользователем, потому что я декомпилировал старое приложение, и везде были одни и те же проблемы. Я закомментировал эти конфликты, и приложение работало отлично. Еще раз спасибо - person MindRoasterMir; 12.01.2019

InitializeComponent метод создается автоматически в MainWindow.g.cs, когда вы определяете MainWindow.xaml.

person Haojie    schedule 21.08.2014

Как я сказал в своем комментарии, прочтите. Правильное чтение - это достоинство, которое вам понадобится в вашей карьере программиста.

Вам нужно внимательно следить за записью в книге:

Чтобы создать этот пример, вы должны запрограммировать класс Window1 с нуля (щелкните правой кнопкой мыши Обозреватель решений и выберите «Добавить» -> «Класс», чтобы начать работу). Вы не можете выбрать «Добавить» -> «Окно», потому что это добавит файл кода и шаблон XAML для вашего окна вместе с автоматически созданным методом InitializeComponent ().

Полученная ошибка также говорит вам об этом: вы пытаетесь определить другой InitializeComponent() метод.

person CodeCaster    schedule 21.08.2014
comment
Ваш покровительственный тон бесполезен. Не нужно хлопать по запястьям, просто скажите ответ или ничего не говорите. - person LordWilmore; 10.08.2015
comment
@LordWilmore, это не означало покровительствовать или снисходительно, но я понимаю, как это можно так истолковать. Спасибо за ваше объяснение. Тем не менее, когда вы следите за учебным пособием, но читаете только его половину, вы обязательно столкнетесь с проблемами: это то, о чем я пытаюсь сказать в первой строке своего ответа. - person CodeCaster; 10.08.2015
comment
И еще один задиристый противник, который не хочет слышать, что они сделали не так, но хочет получить ответ, который можно скопировать и вставить. Вперед, голосуйте против. - person CodeCaster; 12.04.2016
comment
Это очень хорошее предложение, ничего плохого, если я думаю положительно, спасибо - person MindRoasterMir; 12.01.2019

Для меня это было использование привязки Cocoa Framework с Xamarin iOS.

В представлении, которое я использовал, было два конструктора с именем init () с разными перегрузками.

Я удалил один из них в ApiDefinition.cs, что помогло мне. Может, это кому-то поможет.

person Dennis    schedule 24.02.2020