编辑时有更好的解释!
我通过C#学习(我是一名学生)并且我自己制作游戏。它是MasterMind。我已经完成了所有代码,但只有一个错误导致无法测试我的代码。
因此,使用调用的函数是静态的,以及方法本身。 我将举一个代码示例,因为我不太了解如何制定问题。
public static void ProcesColors(Models.Rij_Master HuidigConfig, int lengte)
{
/* first get the control, so we can add changes to it */
ucRij try = (ucRij) FindChildInGrid(Res, 0, 0);
switch (lengte)
{
...;
}
}
他给出了Res的错误,Res是我的xaml页面上网格中的网格。 我已经尝试过ref关键字(在方法参数和方法中参数的定义中),out,static,但这些都不起作用。 错误是:
非静态字段,方法或属性需要对象引用
所以我知道它需要一个参考,因为它是一个参考类型,但我不知道如何强迫它。
(顺便说一句,我的网格Res在自定义控件内)
我在网格中找到孩子的方法是:
private static FrameworkElement FindChildInGrid(Grid g, int row, int col)
{
var childs = g.Children.Cast<FrameworkElement>();
return childs.Where(x => Grid.GetRow(x) == row && Grid.GetColumn(x) == col).FirstOrDefault();
}
我做过一些研究,有很多关于静态方法,变量等等的信息......但是关于如何实际调用它们的非诺。
我希望我的问题很明确,而且这不是什么愚蠢的事情。 对不起,很长的帖子已经感谢你阅读了,
问候!
(删除了一些东西)
修改::
最好先读到底部,我会问一个定义问题,如果那个问题得到解答,那我就不需要其他所有
所以......从哪里开始...... 我有一个类,MasterMind和一个MasterMind_Row类。我还构建了一些自定义控件(它们都相互嵌套)。
主要思想是,如果用户dubbel点击图例(ucLegend控件)中的颜色元素,则必须更改试用行中的第一个可用颜色。所以我有两件事需要处理,在我的班级MasterMind中我必须将CurrentConfig MasterMind_Row更改为其值,以便类可以检查正确的颜色,并且我必须在自定义控件中更改颜色。
您在Procescolors中看到的代码在我的控件ucGame中。 在那里,它选择位于网格中正确位置的Row控件,并从4个边框更改它的背景。 我通过在RowClass中创建4个公共属性来实现这一点,在setter中它改变了边框的背景。
这在我的代码中都是一个引导,所以你会理解我想要实现的目标。
现在我将为您提供如何实现的代码路径: (在ucLegend中,实现双击的东西):
private void ProcesColor(object sender, DoubleTappedRoutedEventArgs e)
{
Border brd = (Border) sender;
Brush selectColor = brd.Background;
MasterMind.FillColorsByClick(selectColor);
}
然后我们转到处理点击的MasterMind类。 这个necesearry是静态的吗?或者可以省略(它会解决所有问题)
public **static** void FillColorsByClick(Brush selectColor)
{
if (arrSelectionChoice.Length < 4)
{
/* resize array */
ExpandArray1Pos(arrSelectionChoice);
/* fill in the array */
arrSelectonChoice[arrSelectonChoice.Length - 1] = selectColor;
/* fill the color in on the right property (color1,color2,color3,color4)
in the MasterMind_Row CurrentConfig */
FillElementsInRowObject();
/* send the currentconfig Row (with it's colors) to the ucLegend control*/
ucSpel.ProcesColors(HuidigConfig, arrSelectieKeuze.Length);
}
}
现在是我之前发布的代码。 在控件 ucGame 中,我们有以下内容:
public **static** void ProcesColors(Models.Rij_Master HuidigConfig, int lengte)
{
/* first select rowcontrol to make changes to it */
ucRij tryout = (ucRij) FindChildInGrid(ref Res, 0, 0);
switch (lengte)
{
case 1:
tryout.Color1SetBackground = HuidigConfig.Color1;
case 2:
tryout.Color1SetBackground = HuidigConfig.Color1;
tryout.Color2SetBackground = HuidigConfig.Color2;
case 3:
tryout.Color1SetBackground = HuidigConfig.Color1;
tryout.Color2SetBackground = HuidigConfig.Color2;
tryout.Color3SetBackground = HuidigConfig.Color3;
case 4:
tryout.Color1SetBackground = HuidigConfig.Color1;
tryout.Color2SetBackground = HuidigConfig.Color2;
tryout.Color3SetBackground = HuidigConfig.Color3;
tryout.Color4SetBackground = HuidigConfig.Color4;
}
}
现在的主要问题是什么,再看看我的代码,是不是他们都拥有静态属性?我知道一旦你做了1静态,你必须使整个链变为静态,但是可以在没有静态的情况下做到这一点吗?
我正在选择元素的网格也在我的ucGame控件中。所以我无法从课堂上或其他任何地方传递它。
我知道这是一个非常长的帖子,我真的很感谢读这篇文章的人。我仍然是一名学习程序员,但我不会变得更好,更专业,因此这个项目是我为自己做的。
我已经在stackoverflow上找到了很多答案,并且我自己也开始成为活跃的成员。我真的很喜欢这个网站。
对于长篇帖子再次抱歉,我希望这不是一个愚蠢的问题..
我真诚地
答案 0 :(得分:0)
我假设ProcesColors
是您已添加到窗口代码隐藏中的功能。
正如您所提到的,问题在于ProcesColors
函数是static
,而Res
是Grid
的一个实例。在你的页面上。因此,ProcesColors
并不知道Res
是什么。如果ProcesColors
确实应该保留static
,那么您需要通过任何代码调用Res
将ProcesColors
传递给它。或者,也许ProcesColors
不应该是static
。如果您发布了调用ProcesColors
的函数的代码,我们可能会帮助您进一步提升。