SL中如何判断控件内的某点坐标的颜色? 比如我的Grid, 我想知道在0,0是什么颜色, 0,1是什么颜色?
如题。
我现在想在 Grid控件的格子上画个字,
但不知道哪个格子上有字的一部分, 比如我的grid的背景是黑色, 字是红色, 我想知道grid内的每个cell的颜色 是黑色 还是红色?
[解决办法]
if (cell.Background == new SolidColorBrush(Colors.Red)) { };
[解决办法]
Grid只是用来支持LayOut用的,他本身并不是一个逻辑划分Child的Control。
所以,我的建议是遍历Grid的Children。然后检查每个Children的Grid.Row和Grid.Column。找到匹配的Control后,进行Brush比较。
另外,1楼的回答请慎重考虑。我怎么觉得
new SolidColorBrush(Colors.Red)==new SolidColorBrush(Colors.Red);这样的Code肯定会返回false呢?
SolidColorBrush可是Class啊,Object比较不能用==吧。
[解决办法]
Grid控制Cell比较麻烦,尽管实现效率也不高。可以考虑使用自定义控件控制,或者使用datagrid控件。
相对来说,控制Grid的Row比较容易,你可以参考下面的代码,设置Grid的Row背景。
private List<DataGridRow> _myDataGridRows = new List<DataGridRow>(); void myDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) { _myDataGridRows.Add(e.Row); } void myDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { this.ResetRowsColor(); var possibleSelection = _myDataGridRows.Where(w => w.GetIndex() == myDataGrid.SelectedIndex - 1 || w.GetIndex() == myDataGrid.SelectedIndex + 2) .ToList(); if (possibleSelection.Count == 2) { this.SetRowColor(possibleSelection.ElementAt(0), Colors.Red); this.SetRowColor(possibleSelection.ElementAt(1), Colors.Blue); } else if (possibleSelection.Count == 1) { if (possibleSelection.ElementAt(0).GetIndex() < myDataGrid.SelectedIndex) { this.SetRowColor(possibleSelection.ElementAt(0), Colors.Red); } else { this.SetRowColor(possibleSelection.ElementAt(0), Colors.Blue); } } } public void ResetRowsColor() { foreach (var row in this._myDataGridRows) { this.SetRowColor(row, Colors.Transparent); } } private void SetRowColor(DataGridRow row, Color color) { Grid rootGrid = MyVisualTreeHelper.SearchFrameworkElement(row, "Root") as Grid; if (rootGrid != null) { rootGrid.Background = new SolidColorBrush(color); } } public FrameworkElement SearchFrameworkElement(FrameworkElement parentFrameworkElement, string childFrameworkElementNameToSearch) { FrameworkElement childFrameworkElementFound = null; SearchFrameworkElement(parentFrameworkElement, ref childFrameworkElementFound, childFrameworkElementNameToSearch); return childFrameworkElementFound; } private void SearchFrameworkElement(FrameworkElement parentFrameworkElement, ref FrameworkElement childFrameworkElementToFind, string childFrameworkElementName) { int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement); if (childrenCount > 0) { FrameworkElement childFrameworkElement = null; for (int i = 0; i < childrenCount; i++) { childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i); if (childFrameworkElement != null && childFrameworkElement.Name.Equals(childFrameworkElementName)) { childFrameworkElementToFind = childFrameworkElement; return; } SearchFrameworkElement(childFrameworkElement, ref childFrameworkElementToFind, childFrameworkElementName); } } }