我制作了一个按原样工作的程序,但是我希望通过将一些逻辑移动到其他.cs文件中来更好地组织代码。在移动一些代码时,我注意到代码正在re"这个"用于更改应用程序宽度/高度的关键字不再起作用,而且我没有运气试图获得#34;这个",请帮助
int heightd = (int)this.Height;
编辑:进一步澄清。我的mainwindow.xaml.cs是我以前的所有代码。 我会用this.width来获取我的窗口宽度。
创建一个不同的.cs文件来保存相关的方法后,它打破了我的所有"这个"参考文献的。
我希望我的新cs文件能够处理"这个"从我的主程序。所以我可以称它的宽度,高度等
重新编辑:我理解"这个"从我的新类不能正常运行我只是希望能够创建使用相同对象的方法,这些对象在"这个"被重新引用。 例如,Class2可以做WorkAround.height; WorkAround可以处理任何"这个"在第1课。
Soution:在新类中更新签名以接受主窗口:
public static void Marginnn(MainWindow aplication)
{
发送"这个"在通话期间从主要班级:
WindowsInterop.Marginnn(this);
答案 0 :(得分:2)
其他人讨论了部分类,这可能会有问题。对于这个答案,我假设通过"移动到另一个.cs文件"你的意思是"搬到另一个班级,"正如你的标题所示。
this
关键字实际上是一个变量,它引用了"拥有的实例"目前的方法。如果将方法移动到另一种类型,则实例不再是该方法的所有者。相反,您需要将对实例的引用传递给方法。这将是一个方法参数,其名称不是this
。
实施例;之前:
class App
{
public void DoSomethingWithTheHeight()
{
int heightd = (int)this.Height;
//more code
}
public void CallDoSomethingWithTheHeight()
{
this.DoSomethingWithTheHeight();
}
}
任务:将DoSomethingWithTheHeight移动到新的静态类:
class App
{
public void CallDoSomethingWithTheHeight()
{
NewClass.DoSomethingWithTheHeight(this);
}
}
static class NewClass
{
public static void DoSomethingWithTheHeight(App application)
{
int heightd = (int)application.Height;
//more code
}
}
任务:将DoSomethingWithTheHeight移动到新的非静态类:
class App
{
public void CallDoSomethingWithTheHeight()
{
NewClass instanceOfNewClass = new NewClass();
instanceOfNewClass.DoSomethingWithTheHeight(this);
}
}
class NewClass
{
public void DoSomethingWithTheHeight(App application)
{
int heightd = (int)application.Height;
//more code
}
}
还有其他可能性,但这些例子应说明基本原则。
答案 1 :(得分:1)
如果您只想将类的一部分移动到另一个文件并仍然使用this
,则必须使用部分类。但是我不推荐这种方法,你的代码显然需要一些重构。
答案 2 :(得分:1)
C#keyword this
指的是它正在使用的类的当前实例。它可以用于其他一些东西,例如扩展方法的第一个参数的修饰符,但是我们在这里不用担心。因此,您只能在其引用的类中使用this
,并注意它可能不会与static
类,方法,字段等一起使用...因为它们有没有与他们相关的实例。
如果您引用的代码未在partial
类中实现,则必须引用Window
的实例。否则,无法判断this
是什么。由于我们不知道您是如何构建程序的,因此很难推荐一种获取相关Window
实例的方法。例如,如果您使用MVVM
模式,您甚至不需要在代码中与UI实例进行交互。但是,如果您正在使用代码隐藏模型,那么最好的办法就是为该窗口创建一个partial
类。就像我说的那样,在不了解环境的整个范围的情况下,很难知道你的情况是什么。
有很多方法可以解决这个问题,而且有些方法比其他方法更为苛刻:
// In the code-behind of a window...
public static MyWindow Instance { get; private set; }
public MyWindow()
{
Initialize();
Instance = this;
}
// Somewhere else in your program...
var someValue = MyWindow.Instance.SomeControl.Value;
请注意,上述代码仅用于演示目的,而不是我建议做的事情(它甚至不会考虑null
,但这很容易解决)。它只是一个示范,表明几乎有无数种方法可以解决您的问题。理想情况下,如果您不使用MVVM,我可能会实现一个窗口管理器类来处理所有应用程序窗口的实例。