Как изменить уровень доступа к полям, сгенерированным дизайнером графического интерфейса в Xamarin Studio?

Я пишу свой код в Gtk#, используя Xamarin Studio. Когда я создаю новое окно и TreeView в нем, уровень доступа будет закрытым. Я хочу использовать его (TreeView) в другом классе, поэтому я хотел бы изменить уровень доступа на внутренний, но я не мог найти, как я могу это сделать. Спасибо за любую помощь заранее. Вот код, который я хочу изменить с помощью GUI-дизайнера (не писать внутри кода, потому что он будет перезаписан GUI-дизайнером...)

    // This file has been generated by the GUI designer. Do not modify.
namespace XX_xxxx
{
    public partial class Settings
    {
        private global::Gtk.VBox vbox1;

        private global::Gtk.ScrolledWindow GtkScrolledWindow;

        private global::Gtk.TreeView settingsTreeView;

        private global::Gtk.HBox hbox1;

        private global::Gtk.ToggleButton saveAndCloseButton;

        private global::Gtk.ToggleButton closeButton;

        protected virtual void Build ()
        {

Вот где я хочу использовать (в другом классе, где я использую экземпляр класса Settings):settings.settingsTreeView.Model = settingsListStore;

Сообщение об ошибке:

Error CS0122: `XX_xxxxx.Settings.settingsTreeView' is inaccessible 
    due to its protection level (CS0122) (XX_xxxx_GUI)

2 ответа

Решение

Обычно элементы управления помечаются как закрытые, чтобы не допустить проникновения кода в другие модули и непосредственного изменения атрибутов класса. Хорошей новостью является то, что есть другой (ИМХО) лучший способ сделать то, что вы пытаетесь сделать. Поскольку сгенерированный класс помечен как частичный, вы можете использовать не сгенерированный частичный класс Settings с любыми внутренними методами, которые вы добавляете для того, что вашему другому классу необходимо для взаимодействия с пользовательским интерфейсом.

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

public partial class Settings
{ 
    internal void SetModel(ModelType model)
    {
        // Check if valid model and throw some type of argument exception if not
        settingsTreeView.Model = model;
    }
}

и затем назовите это так:

settings.SetModel(settingsListStore);

Я получил этот ответ на форуме Xamarin:

Поддерживаемый способ сделать это - удалить свойство из файла.designer.cs и поместить его в основной файл.cs. Затем удалите атрибут [DesignerGenerated] из объявления.

Генерация кода в конструкторе распознает, что [Outlet] существует в реальном файле.cs, и не поместит его в файл.designer.cs. Как только вы это сделаете, вы можете добавить публичные / внутренние модификаторы, как вы хотите.

Другие вопросы по тегам