【问题标题】:Closing a UserControl in a Grid of MainWindow关闭 MainWindow 网格中的 UserControl
【发布时间】:2016-11-15 19:22:33
【问题描述】:

我正在尝试通过单击按钮来关闭用户控件。 用户控件位于主窗口的网格中。

这就是我打开它的方式。

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

        UsLogin _UsLogin = new UsLogin();
        OpenUserControl(_UsLogin);

    }

    private void OpenUserControl(UsLogin _UsLogin)
    {
        grdVensters.Children.Add(_UsLogin);
    }
}

现在在用户控件中我有一个按钮来确认登录。 (还没有代码,这只是一个模型,用于在课堂上展示我希望它的外观) 我想让这个按钮关闭 grdVensters 中的这个用户控件,这样我的主窗口就准备好了。

我似乎无法在我的用户控件中访问 grdVensters。可以发个链接吗?

试过了:Close current UserControl 但最佳答案关闭了我不想要的 MainWindow。

这看起来像我需要的,但不能让它在我的情况下工作。 Causing a UserControl to remove itself (WPF)

提前致谢!

【问题讨论】:

  • 在此处关闭可能意味着显示/隐藏或将其从网格的子集合中删除。最好将 UC 的 Visibility 属性设置为在 UC 一侧折叠,否则您可以向上遍历树以访问网格。 VisualTreeHelper 课程将在这方面为您提供帮助。
  • 我不确定我是否完全理解了这个问题,但我理解并同意 Mat。其他解决方案可能是将操作传递给控件。单击控件中的按钮时,只需调用操作即可。您可以在构造函数中传递操作,也可以通过属性将其公开。在 Action 的实现中(位于主窗口类中)调用 grdVensters.Children.Remove(_UsLogin);。这不应该需要大量出汗。老实说,因为您使用的是 WPF,所以我会使用 MVVM。

标签: c# wpf user-controls


【解决方案1】:

如果你想使用 WPF,你真的应该选择 MVVM。网络上有大量资源。但是,我创建了一个小示例,可以引导您走向正确的方向。您可以通过在 ViewModel 上设置相关属性来显示/隐藏登录视图。 BooleanToVisibilityConverterbool 值转换为 Visibility 值。我还添加了一个 CheckBox 来演示如何更改可见状态的简单示例。

XAML

<StackPanel>
    <StackPanel.Resources>
        <BooleanToVisibilityConverter x:Key="bToV" />
    </StackPanel.Resources>
    <CheckBox IsChecked="{Binding Path=IsLoginVisible, UpdateSourceTrigger=PropertyChanged}" />
    <Button Content="Login"
            Visibility="{Binding Path=IsLoginVisible, Converter={StaticResource bToV}}" />
    <!--<yournamespace:UsLogin Visibility="{Binding Path=IsLoginVisible, Converter={StaticResource bToV}}/>-->
</StackPanel>

代码背后

public partial class MainWindow  
{
    public MainWindow()
    {
        this.InitializeComponent();

        DataContext = new MainViewModel();
    }
}

public class MainViewModel : ViewModelBase
{
    private bool _isLoginVisible;
    public bool IsLoginVisible
    {
        get
        {
            return _isLoginVisible;
        }
        set
        {
            _isLoginVisible = value;
            OnPropertyChanged();
        }
    }
}

【讨论】:

  • 您好,感谢您抽出宝贵时间回答。我是一名学生,我们还没有介绍过 MVVM(几周后会介绍),但这是一个很好的例子。泰!
  • @JurgenVolders 所以你想接受答案吗?或至少投赞成票? ;-)
  • 对不起,这是我有史以来的第一个问题;)我接受并投了赞成票,但由于我的代表 atm 低于 15,我相信你不会看到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2022-01-20
  • 2014-01-29
  • 1970-01-01
  • 2013-06-02
相关资源
最近更新 更多