当成员控件获得焦点时,WPF Expander应该展开

时间:2018-08-09 05:10:32

标签: c# wpf xaml expander

我在扩展器中有两个文本框。单击按钮时,我正在验证文本框的文本值。如果文本框为空,则为文本框提供焦点。

我要实现的是让扩展器在其中一个texbox集中时自动扩展。

我在互联网上找不到任何方法可以做到这一点。有可能这样做吗?

xaml:

    <Grid>
        <Expander Header="Textbox Expander">
            <StackPanel Orientation="Vertical">
                <TextBox Name="txtName" Height="30" Width="100" Background="WhiteSmoke" />
                <TextBox Name="txtAge" Height="30" Width="100" Background="WhiteSmoke" />
            </StackPanel>
        </Expander>
        <Button Name="btnDone" Content="Done" Width="50" Height="50" Click="btnDone_Click"/>
    </Grid>

c#:

using System.Windows;
using System.Windows.Controls;

namespace TestExpanderFocus
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnDone_Click(object sender, RoutedEventArgs e)
        {
            Validation validation = new Validation();
            if(validation.validate(ref txtName) && validation.validate(ref txtAge))
            {
                //Do Something.
            }
        }
    }            
}

编辑:由于此验证类在另一个应用程序中,因此我无法对其进行编辑。

//Seperate class in another application which cannot be edited
public class Validation
{
    public bool validate(ref TextBox txtobj)
    {
        if (string.IsNullOrWhiteSpace(txtobj.Text))
        {
            MessageBox.Show("Please Enter Data..!");
            txtobj.Focus();
            return false;
        }
        return true;
    }
}

1 个答案:

答案 0 :(得分:1)

您想要实现的实际上很简单。 首先给扩展器起一个名字

<Expander x:Name="MyExpander" ... />

第二,在验证之前,在专注于文本框之前,只需展开扩展器

MyExpander.IsExpanded = true;
...

-编辑以满足新要求-

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void btnDone_Click(object sender, RoutedEventArgs e)
    {
        Validation validation = new Validation();

        // since you know that the text will be focused when the validation fails
        var result1 = validation.validate(ref txtName);
        var result2 = validation.validate(ref txtAge);
        MyExpander.IsExpanded = !result1 || !result2;

        if(result1 && result2)
        {
           //Do Something.
        }
    }
}

但是我必须承认,这不是最好的解决方案。应该有一种更简单的方法,直接将Trigger添加到Expander Style。 (由于没有更多时间,我会将其留给其他人使用)