- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为学校编写一个简单的井字游戏。作业是用 C++ 编写的,但老师允许我使用 C# 和 WPF 作为挑战。我已经完成了所有的游戏逻辑并且表单也基本完成了,但是我遇到了困难。我目前正在使用 Label
来指示轮到谁了,我想在玩家进行有效移动时更改它。根据Applications = Code + Markup ,我应该能够使用 Window
类的 FindName
方法。但是,它一直返回 null
。这是代码:
public TicTacToeGame()
{
Title = "TicTacToe";
SizeToContent = SizeToContent.WidthAndHeight;
ResizeMode = ResizeMode.NoResize;
UniformGrid playingField = new UniformGrid();
playingField.Width = 300;
playingField.Height = 300;
playingField.Margin = new Thickness(20);
Label statusDisplay = new Label();
statusDisplay.Content = "X goes first";
statusDisplay.FontSize = 24;
statusDisplay.Name = "StatusDisplay"; // This is the name of the control
statusDisplay.HorizontalAlignment = HorizontalAlignment.Center;
statusDisplay.Margin = new Thickness(20);
StackPanel layout = new StackPanel();
layout.Children.Add(playingField);
layout.Children.Add(statusDisplay);
Content = layout;
for (int i = 0; i < 9; i++)
{
Button currentButton = new Button();
currentButton.Name = "Space" + i.ToString();
currentButton.FontSize = 32;
currentButton.Click += OnPlayLocationClick;
playingField.Children.Add(currentButton);
}
game = new TicTacToe.GameCore();
}
void OnPlayLocationClick(object sender, RoutedEventArgs args)
{
Button clickedButton = args.Source as Button;
int iButtonNumber = Int32.Parse(clickedButton.Name.Substring(5,1));
int iXPosition = iButtonNumber % 3,
iYPosition = iButtonNumber / 3;
if (game.MoveIsValid(iXPosition, iYPosition) &&
game.Status() == TicTacToe.GameCore.GameStatus.StillGoing)
{
clickedButton.Content =
game.getCurrentPlayer() == TicTacToe.GameCore.Player.X ? "X" : "O";
game.MakeMoveAndChangeTurns(iXPosition, iYPosition);
// And this is where I'm getting it so I can use it.
Label statusDisplay = FindName("StatusDisplay") as Label;
statusDisplay.Content = "It is " +
(game.getCurrentPlayer() == TicTacToe.GameCore.Player.X ? "X" : "O") +
"'s turn";
}
}
这是怎么回事?我在两个地方都使用相同的名称,但 FindName
找不到它。我试过使用 Snoop 查看层次结构,但该表单没有显示在可供选择的应用程序列表中。我在 StackOverflow 上搜索并找到我 should be able to use VisualTreeHelper class ,但我不明白如何使用它。
有什么想法吗?
最佳答案
FindName
对调用控件的 XAML 名称范围进行操作。在您的情况下,由于控件完全是在代码中创建的,因此 XAML 名称范围是空的——这就是 FindName
失败的原因。参见 this page :
Any additions to the element tree after initial loading and processing must call the appropriate implementation of RegisterName for the class that defines the XAML namescope. Otherwise, the added object cannot be referenced by name through methods such as FindName. Merely setting a Name property (or x:Name Attribute) does not register that name into any XAML namescope.
解决问题的最简单方法是将对 StatusDisplay 标签的引用作为私有(private)成员存储在类中。或者,如果您想学习如何使用 VisualTreeHelper 类,可以使用代码片段 at the bottom of this page遍历可视化树以找到匹配的元素。
(已编辑:当然,如果您不想存储对标签的引用,那么调用 RegisterName
比使用 VisualTreeHelper 更省事。)
如果您打算深入使用 WPF/Silverlight,我建议您完整阅读第一个链接。有用的信息。
关于c# - FindName 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2214737/
我覆盖了 ResourceDictionary Generic.xaml 中的控件模板。在那里我添加了一个按钮,我想在上面添加一些事件。 --Added my button
在 WPF 应用程序中,如果在 XAML 中声明了 ContentControl, 然后我可以使用 FindName 在代码中轻松引用它: ContentControl cc = Fin
我有一个窗口的 xaml,里面有一个未命名的边框控件。边框控件使用我编写的附加属性,附加属性基本上将边框控件的 Name 属性设置为已知值,例如“占位符”。加载窗口后,它会尝试通过附加属性赋予它的名称
我正在为学校编写一个简单的井字游戏。作业是用 C++ 编写的,但老师允许我使用 C# 和 WPF 作为挑战。我已经完成了所有的游戏逻辑并且表单也基本完成了,但是我遇到了困难。我目前正在使用 Label
为什么 FindName() 在以下示例中返回 null? XAML:
我创建了一个应用了 XAML 模板的自定义控件。在自定义控件中,我需要操作图像。为此,我尝试使用 FindName 在 OnApplyTemplate 中查找图像。但是,FindName 返回 nul
逐渐学会喜欢mono touch 是否有与 FindName 函数等效的函数,以便我可以从其“字符串”名称操作控件 最佳答案 UIKit 控件( View )没有名称,但它们有标签,标签是整数值 您可
在父控件中查找控件的 FramworkElement.FindName() 方法似乎应该直截了当... 但我正在升级,看起来框架不喜欢我正在尝试做的事情。 首先,我确实意识到有很多不同的做事方式,请记
模板
FindName 对我来说是坏的:( 我要找的对象就在那里。我有证据。 场景如下: ToggleButton button = (ToggleButton)sender; Popup popup =
我遇到了一个问题,我使用 FrameworkElement 对象的“FindName()”方法来搜索该元素的子控件。 我注意到了一些有趣的行为,但似乎无法弄清楚。 如果用户滚动浏览器窗口以便控件本身不
我看到我可以访问 ComboBox 的模板化部分( TextBox 、 PopUp 和 Button )通过 FindName方法。 TextBox应该可以使用 cb.FindName("PART_E
根据 C# 编译器和 Silverlight 2 文档,Silverlight 没有为 DataTemplate 类提供 FindName 方法。我想找到一个位于 ContentPresenter 内
我刚刚测试了来自 here 的早期 PowerShell WPF 示例 #requires -version 2 Add-Type -AssemblyName PresentationFramewor
好吧...这让我很困惑。我已经在我的 UserControl 子类中重写了 OnContentTemplateChanged 。我正在检查为 newContentTemplate 传入的值实际上等于
我目前有一个 WPF 项目,它有一个主窗口和许多作为该窗口子级的用户控件。此窗口的许多子项都是选项卡。我已经成功地用一个用户控件替换了我的主窗口,它实现了与主窗口几乎完全相同的功能。 用 UserCo
所以在下面的示例代码中,我创建了一个 UserControl UserControldChild,它是主窗口 Window1.xaml 的子项。为什么 FindName() 方法无法在下面的代码中找到
我是一名优秀的程序员,十分优秀!