1

在 XAML 和 WinRT 中,有没有办法设置文本框,以便在被点击之前禁用文本输入。

我尝试设置 Tapped 事件,然后设置 IsEnabled=true,但这似乎只在 IsEnabled=true 首先起作用。

我在 MSDN 上找到了这个:http: //social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/708c0949-8b06-40ec-85fd-201139ca8b2d

谈到手动将 TappedEvent 添加到为每个 TextBox 处理的事件中,这很麻烦,但除非 IsEnabled 已设置为 true,否则似乎也不起作用。

基本上,我想要一个所有文本框都显示数据但被禁用的表单,除非用户点击以启用该框然后键入。

4

1 回答 1

2

您可以使用IsReadOnly而不是IsEnabled来实现您正在寻找的东西。此外,您可以轻松地在代码中设置点击事件处理程序。如上所述,我不确定是否需要在代码中设置处理程序才能使其正常工作;但是,它确实简化了事情。

这是详细信息。

在页面类的构造函数中(这里是MainPage),调用 setup 函数:

public MainPage()
{
    this.InitializeComponent();
    // call the setup for the textboxes
    SetupTextBoxes();
}

这是我们做魔术的地方 - 将此页面上的所有文本框设为只读并设置点击处理程序:

private void SetupTextBoxes()
{
    var tbs = GetVisualChildren<TextBox>(this, true);
    foreach (var tb in tbs)
    {
        tb.IsReadOnly = true;
        tb.AddHandler(TappedEvent, new TappedEventHandler(tb_Tapped), true);
    }
}

实用函数,用于获取T传入父项的给定类型 () 的所有子项的列表。

private List<T> GetVisualChildren<T>(DependencyObject parent, bool recurse = true)
where T : DependencyObject
{
    var children = new List<T>();
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < numVisuals; i++)
    {
        DependencyObject v = (DependencyObject)VisualTreeHelper.GetChild(parent, i);
        var child = v as T;
        if (child == null && recurse)
        {
            var myChildren = GetVisualChildren<T>(v, recurse);
            children.AddRange(myChildren);
        }
        if (child != null)
            children.Add(child);
    }
    return children;
}

最后是事件处理程序。这会在点击时启用每个文本框。

private void tb_Tapped(object sender, TappedRoutedEventArgs e)
{
    ((TextBox)(sender)).IsReadOnly = false;
}
于 2013-03-19T21:33:05.950 回答