2012-03-04 4 views
0

Я работаю над проектом и должен получить доступ к метке из обычного класса .cs.
НЕ от MainWindow.xaml.cs!Контроль доступа из обычного класса (.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; 
} 

[...] 
+0

Дайте контроль имя, например '<Ярлык x: Name =" myLabel "... />' – Phil

+0

не будет lblTag.Content = "String"; быть достаточным? – Bahamut

+0

Если элемент управления * назван * lblTag, тогда вы должны просто использовать «lblTag.Content» (без кавычек). Попробуйте ввести «это». и посмотрите, что Intellisense сообщает вам о элементах управления на XAML – kaj

ответ

1

Вам нужна ссылка на экземпляр класса 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:

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

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

, если я просто добавлю его, он выдает исключение NullReferenceException в window.lbl .. – dr0n3

+0

@ dr0n3: возможно, потому, что вы не задали переменную окна. – Robar

+1

@ dr0n3 Сначала необходимо инициализировать переменную. Я отредактировал ответ соответственно. –

0

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

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

на 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"; 
} 
+0

Это просто бросает InvalidOperationException, говорящий мне, что этот объект уже используется в другом потоке. – dr0n3

+0

нечетный.не могли бы вы поделиться тем, как вы передаете ссылку на главный вход в класс? и как вы используете объект класса? – Bahamut