Làm cách nào để lặp qua tất cả các điều khiển trong một cửa sổ trong WPF?WPF: Làm cách nào để lặp qua tất cả các điều khiển trong cửa sổ?
Trả lời
Class để có được một danh sách tất cả các thành phần của trẻ em của một điều khiển:
class Utility
{
private static StringBuilder sbListControls;
public static StringBuilder GetVisualTreeInfo(Visual element)
{
if (element == null)
{
throw new ArgumentNullException(String.Format("Element {0} is null !", element.ToString()));
}
sbListControls = new StringBuilder();
GetControlsList(element, 0);
return sbListControls;
}
private static void GetControlsList(Visual control, int level)
{
const int indent = 4;
int ChildNumber = VisualTreeHelper.GetChildrenCount(control);
for (int i = 0; i <= ChildNumber - 1; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(control, i);
sbListControls.Append(new string(' ', level * indent));
sbListControls.Append(v.GetType());
sbListControls.Append(Environment.NewLine);
if (VisualTreeHelper.GetChildrenCount(v) > 0)
{
GetControlsList(v, level + 1);
}
}
}
}
Không looping thông qua cây hợp lý là tốt hơn và hiệu quả hơn looping thông qua cây thị giác. – MegaMind
'sbListControls' phải là một biến cục bộ, chỉ trong trường hợp các phương thức này được gọi cùng một lúc bởi nhiều luồng. –
Tôi thấy điều này trong MSDN documenation nên nó giúp.
// Enumerate all the descendants of the visual object.
static public void EnumVisual(Visual myVisual)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
{
// Retrieve child visual at specified index value.
Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);
// Do processing of the child visual object.
// Enumerate children of the child visual object.
EnumVisual(childVisual);
}
}
Có vẻ đơn giản hơn với tôi. Tôi đã sử dụng nó để tìm các hộp văn bản trong một biểu mẫu và xóa dữ liệu của chúng.
Tôi đăng một câu trả lời khác dựa trên điều này thực sự trả về một 'IEnumerable
Khi tôi cố gắng để tái sản xuất này tôi nhận được một lỗi trên myVisual (tức là .GetChildrenCount (** myVisual **) & .GetChild (** myVisual **, i)) nói "không thể chuyển đổi từ 'Windows.UI.Composition.Visual 'to' Windows.UI.Xaml.DependencyObject '"? Các giải pháp WPF có hoạt động trong môi trường UWP không? Tôi có sử dụng sai chỉ thị bằng cách sử dụng (Windows.UI.Composition)? – gaw
Một biến thể nhẹ vào câu trả lời MSDN ... chỉ cần vượt qua trong một danh sách rỗng của các đối tượng trực quan vào nó và bộ sưu tập của bạn sẽ được áp dụng với tất cả các hình ảnh con:
/// <summary>
/// Enumerate all the descendants (children) of a visual object.
/// </summary>
/// <param name="parent">Starting visual (parent).</param>
/// <param name="collection">Collection, into which is placed all of the descendant visuals.</param>
public static void EnumVisual(Visual parent, List<Visual> collection)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
// Get the child visual at specified index value.
Visual childVisual = (Visual)VisualTreeHelper.GetChild(parent, i);
// Add the child visual object to the collection.
collection.Add(childVisual);
// Recursively enumerate children of the child visual object.
EnumVisual(childVisual, collection);
}
}
Tôi đăng một câu trả lời khác dựa trên thực tế bạn trả về một 'IEnumerable
Bằng cách này là vượt trội so với các Phương thức MSDN, trong đó nó có thể tái sử dụng, và nó cho phép hủy bỏ vòng lặp sớm (tức là thông qua, break;
, v.v.) - nó tối ưu hóa vòng lặp for ở chỗ nó lưu một lời gọi phương thức cho mỗi lần lặp - và nó cũng cho phép bạn sử dụng thường xuyên cho các vòng lặp thông qua một đứa trẻ của Visual, hoặc thậm chí recurse nó là trẻ em và đó là trẻ em lớn - vì vậy nó đơn giản hơn nhiều để tiêu thụ.
Để tiêu thụ nó, bạn chỉ có thể viết một vòng lặp foreach thường xuyên (hoặc thậm chí sử dụng LINQ):
foreach (var ctrl in myWindow.GetChildren())
{
// Process children here!
}
Hoặc nếu bạn không muốn để recurse:
foreach (var ctrl in myWindow.GetChildren(false))
{
// Process children here!
}
Để làm cho nó công việc, bạn chỉ cần đặt phương thức mở rộng này vào bất kỳ lớp tĩnh nào và sau đó bạn sẽ có thể viết mã như trên bất cứ lúc nào bạn muốn:
public static IEnumerable<Visual> GetChildren(this Visual parent, bool recurse = true)
{
if (parent != null)
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
// Retrieve child visual at specified index value.
var child = VisualTreeHelper.GetChild(parent, i) as Visual;
if (child != null)
{
yield return child;
if (recurse)
{
foreach (var grandChild in child.GetChildren(true))
{
yield return grandChild;
}
}
}
}
}
}
Ngoài ra, nếu bạn không thích đệ quy được bật theo mặc định, bạn có thể thay đổi tuyên bố của phương thức tiện ích mở rộng để có recurse = false
là hành vi mặc định.
Tôi đã sử dụng các mục sau để có tất cả các điều khiển.
public static IList<Control> GetControls(this DependencyObject parent)
{
var result = new List<Control>();
for (int x = 0; x < VisualTreeHelper.GetChildrenCount(parent); x++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, x);
var instance = child as Control;
if (null != instance)
result.Add(instance);
result.AddRange(child.GetControls());
}
return result;
}
- 1. Làm cách nào để đặt Margin mặc định cho tất cả các điều khiển trên tất cả các cửa sổ WPF của tôi?
- 2. Vô hiệu hóa tất cả trừ một điều khiển con trong cửa sổ WPF
- 3. WPF: Cách tự động thêm các điều khiển trong cửa sổ WPF được tạo động
- 4. Nhúng cửa sổ Bảng điều khiển bên trong Cửa sổ WPF
- 5. Làm cách nào để tập trung vào điều khiển trong các hình thức cửa sổ
- 6. làm cách nào để ẩn tất cả các bảng ở dạng cửa sổ?
- 7. Xử lý WM_NCACTIVATE trong cửa sổ khởi động chặn tất cả các cửa sổ khác
- 8. Làm cách nào để đóng tất cả các cửa sổ trong tab hiện tại của vim
- 9. WPF có các điều khiển tương đương cho tất cả các điều khiển Winforms không?
- 10. Cửa sổ phương thức WPF bằng cách sử dụng ShowDialog() Chặn tất cả các cửa sổ khác
- 11. Làm cách nào để tự động xóa tất cả các điều khiển trong điều khiển người dùng?
- 12. Lặp qua tất cả các điều khiển của người dùng trên một trang
- 13. Làm cách nào để mở cửa sổ thứ hai từ cửa sổ đầu tiên trong wpf?
- 14. Làm cách nào để lặp qua tất cả các phương thức của một lớp trong Perl?
- 15. Cách tạo Cửa sổ Mẫu trong WPF?
- 16. Làm cách nào để "Mở trong Cửa sổ mới" bằng cách sử dụng điều khiển WebBrowser?
- 17. Làm cách nào để lặp qua tất cả các dòng tệp được truyền trên dòng lệnh?
- 18. Có cách nào để hiển thị các điều khiển WPF trên đầu trang của điều khiển wpf WebBrowser không?
- 19. Làm cách nào tôi có thể ghi vào cửa sổ bảng điều khiển để gỡ lỗi?
- 20. WPF cửa sổ chủ đề điều khiển để phù hợp với những người Telerik
- 21. Làm cách nào để ngăn cửa sổ bảng điều khiển đóng khi chạy ứng dụng bảng điều khiển?
- 22. Làm cách nào để lặp qua tất cả các khóa của tùy chọn được chia sẻ?
- 23. Lặp qua tất cả các Tài nguyên trong ResourceManager - C#
- 24. Làm thế nào tôi có thể sắp xếp nhanh các điều khiển trong một cửa sổ WPF?
- 25. Truy cập tất cả các nút trong Điều khiển TreeView
- 26. Làm cách nào để tạm dừng cửa sổ bảng điều khiển trong tệp .pl và .bat?
- 27. Làm thế nào để lặp qua tất cả các bảng trong MS Access DB
- 28. Tôi làm cách nào để có được tất cả các sự kiện cửa sổ trong JQuery 1.9?
- 29. Làm cách nào để có cửa sổ chính trong Bộ điều khiển FXML?
- 30. jQuery: làm cách nào để lặp qua tất cả các phần tử 'a'?
Liên kết này có thể là một khởi đầu tốt đẹp: http://msdn.microsoft.com/en-us/library/bb613556.aspx – VVS
bạn có thể tìm thấy câu trả lời trong: http://stackoverflow.com/câu hỏi/974598/find-all-controls-in-wpf-cửa sổ-by-loại –