c # - Adgangskontroller fra en normal klasse (.cs)

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på et projekt og har brug for at få adgang til en etiket fra en normal class.cs.

IKKE fra MainWindow.xaml.cs!


MainWindow.xaml: indeholder en etiket lblTag.


Class.cs skal udføre:


lblTag.Content = "Content";


Hvordan kan jeg indse det?


Jeg ender med 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;
}

[...]

Bedste reference


Du har brug for en henvisning til en instans af MainWindow klasse i din klasse:


public Class
{
    private MainWindow window;

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

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


Du skal overføre en reference til din vinduesinstans til klassen. Fra inde i din MainWindow vinduekode bag dig ville ringe:


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


REDIGERE:


Du kan kun få adgang til kontroller fra samme tråd. Hvis din klasse kører i en anden tråd, skal du bruge 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;
            }));
}

Andre referencer 1


efter redigering synes dette tydeligere nu. Damirs svar skal være korrekt.


Tilføj blot et mainwindow-objekt på Class.cs og send hovedvinduets eksempel til klassens konstruktør.


på mainwindow.xaml.cs


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


på Class.cs


...
MainWindow mWindow = null;

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

private void Initialize()
{
   window.lblTag.Content = "whateverobject";
}