Контроль доступа из нормального класса (.cs) - PullRequest
0 голосов
/ 04 марта 2012

Я работаю над проектом и мне нужен доступ к метке из обычного class.cs.
НЕ из MainWindow.xaml.cs!

MainWindow.xaml: содержит метку lblTag.

Class.cs должен выполнить:

lblTag.Content = "Content";

Как я могу это понять?

Я просто получаю InvalidOperationExceptions.

Window1.xaml.cs:

public Window1()
{
    InitializeComponent();
    [...]
}

[...]
StreamElement se1;
StreamElement se2;

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    [...]
    se1 = new StreamElement(this);
    se2 = new StreamElement(this);

    [...]
}

[...]

StreamElement.cs:

[...]
private Window1 _window;
[...]

public StreamElement(Window1 window)
{
    _window = window;
}

[...]

//metaSync is called, whenever the station (it's a sort of internet radio recorder)
//changes the meta data
public void metaSync(int handle, int channle, int data, IntPtr user)
{
    [...]

    //Tags just gets the meta data from the file stream
    Tags t = new Tags(_url, _stream);
    t.getTags();

    //throws InvalidOperationException - Already used in another thread
    //_window.lblTag.Content = "Content" + t.title;
}

[...]

Ответы [ 2 ]

1 голос
/ 04 марта 2012

Вам нужна ссылка на экземпляр класса MainWindow в вашем классе:

public Class
{
    private MainWindow window;

    public Class(MainWindow mainWindow)
    {
        window = mainWindow;
    }

    public void MyMethod()
    {
        window.lblTag.Content = "Content";
    }
}

Вам нужно передать ссылку на ваш экземпляр окна в класс. Изнутри кода вашего окна MainWindow вы бы позвонили:

var c = new Class(this);
c.MyMethod();

EDIT:

Вы можете получить доступ только к элементам управления из того же потока. Если ваш класс работает в другом потоке, вам нужно использовать Dispatcher:

public void metaSync(int handle, int channle, int data, IntPtr user)
{
    [...]

    //Tags just gets the meta data from the file stream
    Tags t = new Tags(_url, _stream);
    t.getTags();

    //throws InvalidOperationException - Already used in another thread
    //_window.lblTag.Content = "Content" + t.title;

    _window.lblTag.Dispatcher.BeginInvoke((Action)(() =>
            {
                _window.lblTag.Content = "Content" + t.title;
            }));
}
0 голосов
/ 04 марта 2012

после редактирования это кажется более понятным. Ответ Дамира должен быть правильным.

Просто добавьте объект mainwindow в Class.cs и передайте его экземпляр в конструктор класса.

на mainwindow.xaml.cs

...
Class class = new Class(this);
...

в Class.cs

...
MainWindow mWindow = null;

// constructor
public Class(MainWindow window)
{
   mWindow = window;
}

private void Initialize()
{
   window.lblTag.Content = "whateverobject";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...